JSPM

  • Created
  • Published
  • Downloads 155
  • Score
    100M100P100Q91553F
  • License See License in LICENSE.md

Unleash the future of data management with the ultimate platform for secure, scalable, and dynamic data operations. Power the next generation of applications by combining advanced encryption, revolutionary real-time querying, and seamless synchronization to create an ecosystem where data transforms into action. Effortlessly manage hierarchical structures, deploy groundbreaking queries, and enable unparalleled collaboration with robust integration capabilities. Build enterprise solutions, real-time dashboards, or futuristic IoT systems with a cosmic cornerstone for data innovation.

Package Exports

  • @trap_stevo/star-vault

Readme

πŸš€ Star-Vault

Unleash the future of data management with the ultimate platform for secure, scalable, and dynamic data operations. Power the next generation of applications by combining advanced encryption, revolutionary real-time querying, and seamless synchronization to create an ecosystem where data transforms into action.


🌌 Features

  • πŸ” Optional Encryption – Secure sensitive data at rest
  • βš™οΈ Sharded Storage Engine – Efficiently scales writes across shards
  • 🧠 In-Memory Caching – High-speed read layer with StarCache
  • πŸ“œ Write-Ahead Logging – Resilient logs with rotation and retention policies
  • πŸ” Advanced Query Engine – Chainable and expressive queries with filtering, search, sorting, and spatial support
  • πŸš€ Real-Time Event Emission – Listen to data changes with fine-grained control
  • πŸ›‘οΈ Authentication Layer – Optional handler to authorize every operation
  • 🌠 Collection Wildcards – Seamlessly operate across multiple collections

βš™οΈ System Requirements

Requirement Version
Node.js β‰₯ 19.x
npm β‰₯ 9.x (recommended)
OS Windows, macOS, Linux

πŸ“œ API Specifications

πŸ”§ Constructor

Use these parameters when initializing StarVault.

new StarVault(dbPath, logPath, shardCount, maxLogSize, logRetention, options)

Core Parameters

Key Description Default
dbPath Root directory for all collection data; each collection is stored in sharded files. Required
logPath Directory where write-ahead logs (WAL) are stored for durability and replay. Required
shardCount Number of shards used per collection. More shards improve concurrency. 4
maxLogSize Max size of each WAL file before rotation. Accepts values like "100MB". "869MB"
logRetention Duration to retain old WAL files. Accepts values like "1w" or "30d". "1w"

options Object

Key Description Default
enableEncryption Enables encryption for data at rest. false
vaultPath Path to the vault metadata file used for encryption. "./star-vault.json"
masterKey Master encryption key for vault encryption. Must securely generate/store. null
authHandler Custom function that receives clientAuth and returns true/false. null
authOptions Configuration object passed to internal StarAuth for authentication. {}
auditHistory Turn on default auditing for history/timeline reads (writes entries to audit.log). Also toggle per call. false
enableMesh Turn on StarMesh sync layer. false
meshOptions Options passed to StarMesh when enableMesh = true. {}
dirMode UNIX permission mode for directories (e.g., 0o700). 0o700
fileMode UNIX permission mode for files (e.g., 0o600). 0o600

πŸ” authOptions (StarAuth Configuration)

Pass this object under the options.authOptions key when creating your StarVault instance.

Collection Settings

Key Description Default
collection User collection name "auth-users"
sessionCollection Session tracking collection "auth-sessions"
resetCollection Password reset token collection "auth-resets"
lockCollection Lockout state tracking collection (per account/IP/UA). "auth-locks"
stellarCollection Magic link / code token collection "stellar-auths"

Session Behavior

These options control the creation, validation, and protection of sessions against brute-force attacks.

Key Description Default
tokenExpiry Lifetime of each session token in seconds. 3600 (1 hour)
sessionValidationFields Fields compared on every request to detect hijacking (e.g. IP, fingerprint). ["ip", "fingerprint"]
strictSessionValidation If true, any mismatch in validation fields invalidates the session. true
enableSuspiciousCheck If true, compares geo/IP against recent sessions to flag anomalies. true
sessionPolicy Session strategy: "default" (allow many), "strict" (1 active max), "replace" (replace old). "default"

πŸ”’ Lockout Configuration

Controls the tracking, weighting, and escalation behavior of failed login attempts. All options go inside options.authOptions.lockout.

Key Description Default
strategy Lockout algorithm: "fixed", "slidingWindow", or "exponential". "fixed"
scopes Dimensions to track failures against: ["account", "ip", "ipua"]. ["account", "ipua"]
maxAttempts Failures allowed before triggering lock. 5
baseDuration Base lockout duration in ms. 15 * 60 * 1000
maxDuration Max lockout duration in ms (for exponential strategy). 24 * 60 * 60 * 1000
minDuration Absolute minimum lock duration in ms (applies to all strategies; jitter won’t go below this). 30 * 1000
jitterDuration Random jitter Β± ms added to lock duration. 15 * 1000
decayDuration Auto-decay failures if no attempts within this duration. 30 * 60 * 1000
windowDuration For slidingWindow, the rolling time window in ms. 10 * 60 * 1000
windowThreshold For slidingWindow, number of failures in the window that triggers lock. 7
windowGrowth For slidingWindow, how lock duration grows when over threshold: "none" | "linear" | "exponential". "none"
windowGrowthFactor For slidingWindow: "exponential" β€” multiplier per extra failure over threshold. 2
windowGrowthStep For slidingWindow: "linear" β€” extra ms per extra failure over threshold. baseDuration / 2
captchaAfter Number of failures after which a CAPTCHA challenge is required. null
otpAfter Number of failures after which an OTP challenge is required. null
captchaVerifier Function (req) => boolean to validate CAPTCHA. null
otpVerifier Function ({ email, code }) => boolean to validate OTP. null
onLock Callback (info) => void fired when a lock is applied. null
onUnlock Callback (info) => void fired when a lock is cleared. null
onChallenge Callback (info) => void fired when a CAPTCHA/OTP challenge is required. null
notifyLock Optional notifier (info) => void for alerts/logging. null
bypassed Function (req) => boolean to completely bypass lockout logic for trusted requests. null

Timing Heuristics

options.authOptions.lockout.timingHeuristics adds intelligence by classifying failures as bursts, normal, or human-like delays.

Key Description Default
enabled Enable timing heuristics. true
burstDetectionDuration Attempts within this ms count as a burst (weighted more). 3000
humanDetectionDuration Attempts slower than this ms count as human/grace. 45000
maxConsiderDuration Ignore intervals longer than this ms. 600000
burstWeight Weight applied to burst failures. 2.0
normalWeight Weight applied to normal failures. 1.0
graceWeight Weight applied to grace (slow) failures. 0.0
emaAlpha Alpha for exponential moving average of attempt intervals. 0.3
decayOnGrace Whether to decay counters when a grace attempt is detected. true
decayStep How many failures to subtract during a grace decay. 1
minFailures Clamp: minimum number of failures tracked. 0
maxFailures Clamp: maximum number of failures tracked. 9999

Example Fixed Lockout Config

authOptions: {
  lockout: {
    strategy: "fixed",
    scopes: ["account", "ipua"],
    maxAttempts: 5,                     // lock after N total failures
    baseDuration: 15 * 60 * 1000,       // fixed lock duration (with jitter)
    minDuration: 30 * 1000,
          jitterDuration: 15 * 1000,          // desync scripted retries
    decayDuration: 30 * 60 * 1000,      // clear counters after idle period
  
    // Optional human gates
    captchaAfter: 3,
    otpAfter: null,
    captchaVerifier: async (req) => verifyCaptcha(req.body.token),
  
    //  Heuristics amplify bursts, forgive human pace
    timingHeuristics: {
      enabled: true,
      burstDetectionDuration: 3000,
      humanDetectionDuration: 45000,
      burstWeight: 2.0,
      normalWeight: 1.0,
      graceWeight: 0.0,
      emaAlpha: 0.3,
      decayOnGrace: true,
      decayStep: 1,
      minFailures: 0,
      maxFailures: 9999
    },
  
    onLock: (info) => console.log("LOCKED", info),
    onUnlock: (info) => console.log("UNLOCKED", info),
    onChallenge: (info) => console.log("CHALLENGE", info),
    bypassed: (req) => false
  }
}

πŸ‘‰ When to use: Simple setups where predictability matters. Good for smaller apps, prototypes, or admin dashboards where you want consistent enforcement.


Example Sliding Window Lockout Config

authOptions: {
  lockout: {
    strategy: "slidingWindow",
    scopes: ["account", "ipua"],
    
    windowDuration: 10 * 60 * 1000,
          windowThreshold: 7,
    
          baseDuration: 60 * 1000,
          minDuration: 30 * 1000,
          maxDuration: 24 * 60 * 60 * 1000,
          jitterDuration: 15 * 1000,
    
          windowGrowth: "exponential",
          windowGrowthFactor: 2,
          // windowGrowthStep: 30 * 1000, // if using "linear"

    // Optional Human gates
    captchaAfter: 3,
    otpAfter: null,
    captchaVerifier: async (req) => verifyCaptcha(req.body.token),

    // Heuristics amplify bursts, forgive human pace
    timingHeuristics: {
      enabled: true,
      burstDetectionDuration: 2000,
      humanDetectionDuration: 45000,
      burstWeight: 2.5,
      normalWeight: 1.0,
      graceWeight: 0.0,
      emaAlpha: 0.35,
      decayOnGrace: true,
      decayStep: 1,
      minFailures: 0,
      maxFailures: 9999
    },

    onLock: (info) => console.log("LOCKED", info),
    onUnlock: (info) => console.log("UNLOCKED", info),
    onChallenge: (info) => console.log("CHALLENGE", info),
    bypassed: (req) => false
  }
}

πŸ‘‰ When to use: Ideal for games and consumer apps. It’s forgiving to legit players (counters decay naturally) but still stops brute-force bursts quickly.


Example Exponential Lockout Config

authOptions: {
  lockout: {
    strategy: "exponential",
    scopes: ["account", "ipua"],
    maxAttempts: 5,
    baseDuration: 30 * 1000,
          minDuration: 30 * 1000,
          maxDuration: 24 * 60 * 60 * 1000,
          jitterDuration: 10 * 1000,
    captchaAfter: 3,
    otpAfter: 5,
    captchaVerifier: async (req) => verifyCaptcha(req.body.token),
    otpVerifier: async ({ email, code }) => verifyOtp(email, code),
    onLock: (info) => console.log("LOCKED", info),
    onUnlock: (info) => console.log("UNLOCKED", info),
    timingHeuristics: {
      enabled: true,
      burstWeight: 3.0,
      graceWeight: 0.0,
      emaAlpha: 0.4
    }
  }
}

πŸ‘‰ When to use: Best for high-security apps, admin portals, or payment flows. Makes repeated brute-forcing impractical, but can be harsh for end-users if tuned too aggressively.


🧭 Legacy Lockout

These highlight the original β€œsimple” lockout knobs. They remain in place for backward compatibility and apply in addition to the modern authOptions.lockout logic.

Key Description Default
lockoutDuration (Legacy) Fixed lock duration (ms) after too many failed logins. 900000 (15 minutes)
maxLoginAttempts (Legacy) Number of failed attempts before the legacy lockout triggers. 5

How they interact:

  • On every failed login, the modern lockout mechanism (if configured) evaluates first.
  • The legacy counters also increment and, if failedAttempts >= maxLoginAttempts, a fixed lock of lockoutDuration is applied.
  • This ensures older deployments keep their original behavior while you migrate to the new model.

Recommendation:

  • Prefer the new authOptions.lockout settings for fine-grained control.
  • If you want the legacy lockout to rarely affect users, set a very large maxLoginAttempts (e.g., 1_000_000) and leave modern lockout to do the real work.

Example (modern lockout active, legacy effectively neutralized):

authOptions: {
  // Modern lockout (recommended)
  lockout: {
    strategy: "exponential",
    scopes: ["account", "ipua"],
    maxAttempts: 5,
    baseDuration: 15 * 60 * 1000,    // 15 minutes
    maxDuration: 24 * 60 * 60 * 1000 // 24 hours
    // ...captcha/otp/timingHeuristics, etc.
  },

 maxLoginAttempts: 5,
  lockoutDuration: 15 * 60 * 1000
}

Password Management

Key Description Default
passwordRequirements Object defining the password policy { minLength: 8, requireLetter: true, requireNumber: true, requireSymbol: false }
β”” minLength Minimum number of characters required 8
β”” requireLetter Requires at least one letter (a-z or A-Z) true
β”” requireNumber Requires at least one numeric digit (0-9) true
β”” requireSymbol Requires at least one symbol (e.g., !@#$%^&*) false
β”” customValidator Optional custom function (password) => boolean for advanced password checks null
lockingCombinations Password hash complexity 10

🌍 Star Locator Configuration

Key Description Default
enableGeo Enable geo lookups. false
enableReverseGeo Reverse geocode coordinates. false
enableGeoDebug Log provider results. false
geoProviders Extra providers (ip, {signal}) => result. []
ipgeolocationKey ipgeolocation.io key. null
ipinfoToken ipinfo.io token. null
nominatimUserAgent UA for Nominatim reverse geo. "StarAuth/1.0 (star-vault@sclpowerful.com)"
googleMapsKey Google Geocoding key. null
mapboxToken Mapbox token. null
geoCacheTtlMs Cache TTL. 600000
geoDeadlineMs Deadline per lookup. 3000
geoTimeoutMs Timeout per provider. 2500
geoScoreOk Early-accept score threshold. 5
geoMaxConcurrency Max concurrent calls. 8

Example geo Object in Sessions

geo: {
  requestIP: "203.0.113.45",
  ip: "203.0.113.45",
  city: "City",
  region: "Region",
  country: "Country",
  continent: "Continent",
  org: "Org / ASN",
  isp: "ISP",
  loc: "12.3456,-98.7654",
  timezone: "Area/City",
  postal: "ZIP",
  flag: "🌍",
  confidence: 0.83,
  geoAddress: "123 Main St, Example City, Country"
}

Custom Provider Registration

const vault = new StarVault(dataDir, logDir, 4, "869MB", "1w", {
  authOptions: {
    enableGeo: true,
    enableReverseGeo: true,
    ipinfoToken: process.env.IPINFO_TOKEN,
    geoProviders: [
      async function customProvider(ip, { signal }) {
        return { city: "Custom City", country: "Customland" };
      }
    ]
  }
});

Stellar Login

Key Description Default
stellarRequestCooldown Minimum delay between stellar requests 60000 (1 min)
generateStellarCode Function to generate a stellar numeric code 6-digit default

Hooks & Extensions

Key Description
onSuspiciousSession (currentSession, pastSession) => void
handleHijack (session, field, expected, actual) => void
onCleanup ({ result, timestamp, vaultID }) => void
tagSession (session, userData) => string[]

Guest Session Configurations

Key Description Default
allowGuestSessions Enables or disables guest session support. true
guestInactivityThreshold Duration of inactivity (in ms) before considering a guest account stale. 7 * 24 * 60 * 60 * 1000 (1w)
cleanupGuestInterval Interval (in ms) to check for inactive guest accounts. 5 * 60 * 1000 (5m)
guestActivityTrackers Array of custom functions to execute on guest activity updates. []
generateGuestID Function to generate guest user IDs. () => "guest-" + UUID

Cleanup & Locking

Key Description Default
vaultID ID for this vault instance null
autoCleanupInterval How often to auto-clean expired tokens null
expiredSessionCleanupInterval Interval for cleaning expired sessions null
cleanupExpiredTokensActionInfo Metadata for cleanup activity {}
cleanupExpiredTokensClientAuth Auth context used for cleanup calls null
cleanupExpiredSessionsActionInfo Metadata for session cleanup {}
cleanupExpiredSessionsClientAuth Auth context used during session cleanup null

πŸ“¦ Core Methods

The primary database interaction methods.

Method Description Sync/Async
create(collection, data, actionInfo = {}, clientAuth = null) Creates a new record in the specified collection. Returns the created record object. βœ… Sync
update(collection, id, updates, actionInfo = {}, clientAuth = null) Updates an existing record by ID. Setting record data properties to undefined removes them respectively. Returns the updated record. Throws error if not found. βœ… Sync
unset(collection, id, dotPaths = [], actionInfo = {}, clientAuth = null) Removes specific nested fields using dot notation (e.g., "profile.stats.xp"). Returns updated record. βœ… Sync
deleteCollection(collection, actionInfo = {}, clientAuth = null) Deletes an entire collection. Returns { wholeCollection: true, deleted: true/false }. βœ… Sync
deleteRecord(collection, id, actionInfo = {}, clientAuth = null) Deletes a specific record by ID. Returns { id, deleted: true/false }. βœ… Sync
delete(collection, id, actionInfo = {}, clientAuth = null) Soft-deletes a record by filtering it out and overwriting the collection. Returns { id, deleted: true }. βœ… Sync
softDelete(collection, id, { reason = "soft-delete", deletedBy = null } = {}, actionInfo = {}, clientAuth = null) Mark a record as deleted without removing it. Sets flags: deleted: true, deletedAt, deletedReason, deletedBy. Emits update. Returns { id, softDeleted: true, at, reason, deletedBy }. βœ… Sync
restore(collection, id, { restoredBy = null } = {}, actionInfo = {}, clientAuth = null) Reverse a prior soft delete. Clears deleted* flags and sets restoredAt, restoredBy. Emits update. Returns { id, restored: true, at, restoredBy }. βœ… Sync

🧾 StarTransactions (WAL + Idempotency)

Star-Vault handles multi-record transactions with staged commits, WAL logging, and per-step idempotency.

Core Traits

  • Logs each TX-BEGIN and TX-COMMIT before writing data.
  • Replays committed groups safely after crash or restart.
  • Keeps uncommitted changes isolated until commit.

Transaction Methods

// High-level helper
const { transactionID, result } = await vault.transact({ type: "transfer" }, async (t) => {
     await t.update("accounts", "A", { balance: v => v - 100 });
     await t.update("accounts", "B", { balance: v => v + 100 });
     await t.create("ledger", { from: "A", to: "B", amount: 100, ts: Date.now() });
     return "ok";
});

// Manual flow
const tx = await vault.begin({ type: "batch-import" });
await tx.create("users", { id: "u1", name: "Nova" });
await tx.softDelete("posts", "p-123", { reason: "policy", deletedBy: "mod-9" });
await tx.restore("posts", "p-123", { restoredBy: "mod-9" });
await tx.commit(); // or await tx.abort("reason");
Context Method Purpose Sync/Async
vault transact(actionInfo, fn) Open txn, run fn(tx), commit on success, abort on failure. Returns { transactionID, result }. βš™οΈ Async
vault begin(actionInfo) Start txn and return handle { id, create, update, unset, deleteRecord, softDelete, restore, commit, abort }. βš™οΈ Async
tx create(collection, data, actionInfo?, clientAuth?) Stage record creation. βš™οΈ Async
tx update(collection, id, updates, actionInfo?, clientAuth?) Stage record update; supports function deltas v => v - 50. βš™οΈ Async
tx unset(collection, id, dotPaths = [], actionInfo?, clientAuth?) Stage removal of nested fields. βš™οΈ Async
tx deleteRecord(collection, id, actionInfo?, clientAuth?) Stage hard deletion. βš™οΈ Async
tx softDelete(collection, id, { reason?, deletedBy? } = {}, actionInfo?, clientAuth?) Stage soft deletion (flags only). βš™οΈ Async
tx restore(collection, id, { restoredBy? } = {}, actionInfo?, clientAuth?) Stage record restoration. βš™οΈ Async
tx commit(actionInfo?) Apply staged ops, refresh cache, emit events, seal WAL. βš™οΈ Async
tx abort(reason = "manual") Discard staging and log TX-ABORT. βš™οΈ Async

Idempotency and WAL

  • Each step logs internal transactionID and deterministic idempotencyKey.
  • Steps replay safely on crash recovery; duplicates ignored.

Example Flow

await vault.transact({ actor: "u42" }, async (tx) => {
     await tx.create("users", { id: "42", name: "Orion" });
     await tx.update("profiles", "42", { visits: v => v + 1 });
     await tx.softDelete("sessions", "s-23", { reason: "expired", deletedBy: "system" });
});

πŸ” Query Engine

Chainable query builder for filtering and searching collection data.

vault.query("collection")
     .whereRecord("id", "value")                         // Filters root record data by key-value pairs
     .where({ key: "value" })                         // Filters record data by key-value pairs
     .search("field", "text")                         // Text search within a specific field
     .recent("timestamp", "7d")                       // Gets records from the last 7 days
     .near("location", { lat: 0, lng: 0 }, 50)        // Geospatial filter within 50 units
     .sort({ name: 1 })                               // Sorts by a field (1 = asc, -1 = desc)
     .select(["id", "name"])                          // Selects specific fields
     .limit(10)                                       // Limits results
     .offset(0)                                       // Skips first N records
     .filterBy(record => record.active)              // Filters with custom function
     .execute(exactCollection = false)                // Run the query with optional strict collection matching
Method Description Sync/Async
query(collection) Begins a query on the specified collection. Returns a chainable builder. βœ… Sync
whereRecord(criteria) Filters records by matching key-value pairs. Accepts both object and parameter inputs. βœ… Sync
where(criteria) Filters records' data by matching key-value pairs. Accepts both object and parameter inputs. βœ… Sync
search(field, text) Performs a text search within a specified field. βœ… Sync
recent(field, duration) Filters records based on recency (e.g., "7d" = 7 days). βœ… Sync
near(field, center, radius) Filters based on proximity to a location object { lat, lng }. βœ… Sync
sort(criteria) Sorts the results by one or more fields. βœ… Sync
select(fields) Selects only the specified fields for output. βœ… Sync
limit(number) Restricts the number of records returned. βœ… Sync
offset(number) Skips a number of records (used for pagination). βœ… Sync
filterBy(fn) Filters using a custom function on each record. βœ… Sync
callback(fn) Adds a side effect or transformation hook before execution. βœ… Sync
execute(exactCollection = false) Run the query. If true, match only the exact collection name; otherwise, include related subcollections. βœ… Sync
getByID(collection, id) Shortcut to retrieve a single record by ID. βœ… Sync
range(min, max) Static helper to return an inclusive array of numbers in a range. βœ… Sync

πŸ›‘οΈ Authentication

All methods below require authOptions configuration and are used for session/user management.


πŸ‘€ User Registration & Authentication

Method Description Sync/Async
registerUser(email, password, actionInfo, clientAuth) Registers a new user. `. βš™οΈ Async
registerGuestUser(req, metadata, actionInfo, clientAuth) Registers a temporary guest user. `. βš™οΈ Async
loginGuestUser(accountID, req, actionInfo, clientAuth) Logs in a guest user and creates a session. `. βš™οΈ Async
loginUser(email, password, req, actionInfo, clientAuth) Logs in a user and creates a session. `. βš™οΈ Async
resumeUserSession(accountID, req, actionInfo, clientAuth) Resumes session from account ID (used for guest linking or session carryover). βš™οΈ Async
upgradeGuestUser(accountID, email, password, actionInfo, clientAuth) Converts a guest account to a full registered user. βš™οΈ Async

πŸ›°οΈ Session Management

Method Description Sync/Async
logoutUser(token, actionInfo, clientAuth) Logs out a user by invalidating their session token. βœ… Sync
extendUserSession(token, ms, actionInfo, clientAuth) Extends an active session's duration. βœ… Sync
cleanupExpiredAuthTokens(actionInfo, clientAuth) Cleans up expired tokens and invalid sessions. βœ… Sync
cleanupInactiveGuests(actionInfo, clientAuth) Removes or deactivates inactive guest accounts. βš™οΈ Async

Method Description Sync/Async
updateUserPassword(userID, newPassword, actionInfo, clientAuth) Updates a user's password. βš™οΈ Async
requestUserPasswordReset(email, actionInfo, clientAuth) Sends a password reset token. βš™οΈ Async
resetUserPassword(token, newPassword, actionInfo, clientAuth) Resets password using a valid token. βš™οΈ Async
requestUserStellarLink(email, type, actionInfo, clientAuth) Sends a Stellar link (magic link or code) for login or verification. βš™οΈ Async
consumeUserStellarToken(token, type, req, actionInfo, clientAuth) Consumes a Stellar link/token to verify user and return session. βš™οΈ Async

πŸ‘₯ Guest Account Management

Method Description Sync/Async
registerGuestUser(req, metadata, actionInfo, clientAuth) Registers a guest session with optional request/metadata. βš™οΈ Async
trackGuestActivity(userID, timestamp, actionInfo, clientAuth) Updates guest user's lastActiveAt timestamp. βš™οΈ Async
upgradeGuestUser(accountID, email, password, actionInfo, clientAuth) Promotes a guest to a full registered account. βš™οΈ Async
cleanupInactiveGuests(actionInfo, clientAuth) Cleans up inactive or stale guest users based on threshold. βš™οΈ Async

πŸ” User Lifecycle Management

Method Description Sync/Async
updateUser(accountID, updatedMetadata, accountType, actionInfo, clientAuth) Updates a user by Account ID. Does not allow for password updates. βš™οΈ Async
deleteUser(userID, reason, actionInfo, clientAuth) Soft-deletes a user by ID. βš™οΈ Async
deleteUserByAccountID(accountID, reason, actionInfo, clientAuth) Soft-deletes a user using their account ID. βš™οΈ Async
reactivateUser(userID, actionInfo, clientAuth) Reactivates a previously deleted user. βš™οΈ Async
reactivateUserByAccountID(accountID, actionInfo, clientAuth) Reactivates a deleted user by account ID. βš™οΈ Async

πŸ“Š User & Session Querying

Method Description Sync/Async
getUserByAccountID(accountID, filter, accountType, actionInfo) Retrieves a user by account id. If a certain account type (default ~ guest). βš™οΈ Async
getUser(userID, filter, accountType, actionInfo) Retrieves a user by id. If a certain account type (default ~ guest). βš™οΈ Async
getUserSession(sessionID, actionInfo) Retrieves a session by id. βš™οΈ Async
listSessions(userID, filters, includeInactive, actionInfo) Lists sessions for a specific user. βš™οΈ Async
listAllSessions(filters, includeInactive, actionInfo) Lists all sessions across users. βš™οΈ Async
listUsers(filters, options, actionInfo) Lists users based on filters and options (pagination, includes). βš™οΈ Async
listUserActivity(options, actionInfo) Lists recent activity, including filtering by active, inactive, or recently seen users. βš™οΈ Async

🧩 Internal Validation & Utility Methods

The following utility methods get utilized internally across authentication-related flows. You may call them directly for validation, diagnostics, or extension purposes.

Method Description Sync/Async
validEmail(email) Determines if an input email follows proper email address format. βœ… Sync
satisfiesPasswordStrength(password) Validates whether the password meets the defined passwordRequirements. βœ… Sync
extractSessionMetadata(req) Extracts metadata (IP, fingerprint, user agent, etc.) from the request object . βœ… Sync
lookupUserGeo(ip) Performs geo-IP lookup using built-in and custom geo services . βš™οΈ Async


🧭 Record History & Timeline

Star-Vault reconstructs record history and a human-readable timeline from write-ahead logs (WAL). These calls support filtering, integrity checks, and encryption-aware output.

Methods

Method Description Sync/Async
getRecordHistory(collection, id, options = {}, actionInfo = {}, clientAuth = null) Returns detailed event entries for a record (time-ordered). βœ… Sync
getRecordTimeline(collection, id, options = {}, actionInfo = {}, clientAuth = null) Returns a compact timeline (action, timestamp, brief summary). βœ… Sync

options (history/timeline)

Key Type Default Notes
includeArchived boolean true Include rotated *.archived files when present.
verifyChecksums boolean true Verify each entry’s SHA-256 checksum of data; skip failures.
includeSystem boolean true Merge related system.log entries for the same collection/id (e.g., DELETE, TX events).
actions string | string[] undefined Allow-list of actions to include (e.g., ["WRITE","UPDATE"]). Case-insensitive.
excludeActions string | string[] undefined Block-list of actions to exclude (e.g., ["DELETE"]). Case-insensitive.
since number | string | Date undefined Include entries at/after this time (ms epoch, ISO string, or Date).
until number | string | Date undefined Include entries at/before this time.
match (row) => boolean undefined Custom predicate that keeps/discards rows after other filters.
includeDecrypted boolean (defaults to true when a decryptor exists; otherwise false) When true and encryption enabled, decrypt rows and populate dataDecrypted.
audit boolean undefined Per-call audit switch; when true, writes an audit entry (see Auditing).

ℹ️ Row shape: history entries include source, collection, action, id, timestamp, client, data, checksum, plus eventID, transactionID, idempotencyKey when present. With includeDecrypted and a decryptor, output also includes dataEncrypted and dataDecrypted.

Audit Examples

// Full history (archived segments + checksum verification)
const history = vault.getRecordHistory("users/region1", "1760233994625", {
  includeArchived: true,
  verifyChecksums: true
}, { actor: "admin-1" }, { token: "valid" });

// Windowed, updates only
const updates = vault.getRecordHistory("users/region1", "1760233994625", {
  actions: "UPDATE",
  since: Date.now() - 60_000,
  until: Date.now()
});

// Compact timeline, no deletions, explicit audit
const timeline = vault.getRecordTimeline("users/region1", "1760233994625", {
  excludeActions: ["DELETE", "SOFT_DELETE"]
}, { audit: true }, { token: "valid" });

🧾 Auditing (History & Timeline Reads)

History/timeline reads can trigger auditing to audit.log. Use this for compliance and access tracking.

Control switches

Auditing activates when any of the following holds:

  1. options.audit === true
  2. actionInfo.audit === true
  3. new StarVault(..., { auditHistory: true })

On audit, Star-Vault writes logAudit with:

  • action: "HISTORY_READ" or "TIMELINE_READ"
  • details: { kind, collection, id, count, filters }
    • filters contains a sanitized view of options (booleans/timestamps, allow/block lists, and a flag that notes a custom match predicate).

Encryption enabled? The system may encrypt audit entries at rest.

Audit Example: global default

const vault = new StarVault("./data", "./logs", 4, "869MB", "1w", {
  auditHistory: true
});

Audit Example: per-call

vault.getRecordHistory("orders", "o-123", { audit: true });

Audit Action names

  • HISTORY_READ β€” written after getRecordHistory completes
  • TIMELINE_READ β€” written after getRecordTimeline completes

⚠️ Privacy Notes

  • Handling sensitive data? Prefer includeDecrypted: false unless the caller truly needs decrypted payloads.
  • Console snippets show full records for clarity; in production, prefer logging only ids and checksums.

πŸ“‚ Starchive (Storage Layer)

Starchive provides a unified storage abstraction for both local filesystem and remote S3-compatible backends.
You can configure it for local only, remote only, or a hybrid (both).


βš™οΈ Starchive Configuration Modes

Mode Description Example
Remote (S3) Store files in any S3-compatible backend (AWS, MinIO, Wasabi, etc.). starchive: { local: false, remote: { type: "s3", bucket: "mybucket", clientConfig: { region: "us-east-1" } }, defaultTarget: "remote" }
Local (Filesystem) Store files locally on disk under a managed .starchive directory. starchive: { local: { root: path.join(__dirname, "data", ".starchive") }, remote: false, defaultTarget: "local" }
Hybrid Support both local + S3; choose per call via { target: "local" } or { target: "remote" }. starchive: { local: { root: path.join(__dirname, "data", ".starchive") }, remote: { type: "s3", bucket: "mybucket", clientConfig: { region: "us-east-1" } }, defaultTarget: "remote" }

βš™οΈ Starchive Configurations

Key Type Description Example / Default
collection string | "starchive.files" The collection name you desire holding Starchive file records. "starchive.files"
local object | false Local adapter configuration or false to disable. { root: "./data/.starchive" }
remote object | false Remote adapter config (type: "s3", bucket, clientConfig). { type: "s3", bucket: "mybucket", clientConfig: { region: "us-east-1" } }
defaultTarget "local" | "remote" Which backend to use if not explicitly specified. "local"
remoteDefaultAlias string | null Default remote alias when using target: "remote" and no alias is supplied. First configured alias

Remote clientConfig fields (S3-compatible):

Key Type Description Example
region string AWS region. "us-east-1"
endpoint string S3 endpoint override. "https://s3.us-east-1.amazonaws.com"
accessKeyID string Access key ID. "..."
secretAccessKey string Secret key. "..."
forcePathStyle boolean Use path-style URLs instead of virtual-hosted. true

πŸ” Remote (S3)

starchive: {
  local: false,
  remote: {
    type: "s3",
    bucket: "mybucket",
    clientConfig: {
      secretAccessKey: ".../...",
      accessKeyID: "...",
      endpoint: "https://s3.us-east-1.amazonaws.com",
      region: "us-east-...",
      forcePathStyle: true
    }
  },
  defaultTarget: "remote"
}

Multi-Remote Config Options

You can express remote as:

  1. Object map of aliases β†’ config

    starchive: { local: false, remote: { mediaCDN: { type: "s3", bucket: "media-prod", clientConfig: { region: "us-east-1" } }, logs: { type: "s3", bucket: "app-logs", clientConfig: { region: "us-west-2" } } }, defaultTarget: "remote", remoteDefaultAlias: "mediaCDN" // optional }

  2. Array of remotes (alias inferred from id/alias/bucket)

    starchive: { local: false, remote: [ { id: "mediaCDN", type: "s3", bucket: "media-prod", clientConfig: { region: "us-east-1" } }, { alias: "logs", type: "s3", bucket: "app-logs", clientConfig: { region: "us-west-2" } } ], defaultTarget: "remote", remoteDefaultAlias: "mediaCDN" // optional }

ℹ️ Per call, override the backend with { target: "local" } or { target: "remote", remoteAlias?: "alias", bucket?: "override-bucket" }.

πŸ’» Local (Filesystem)

starchive: {
  local: { root: path.join(__dirname, "data", ".starchive") },
  remote: false,
  defaultTarget: "local"
}

🌐 Hybrid (Local + Remote)

starchive: {
  local: { root: path.join(__dirname, "data", ".starchive") },
  remote: {
    type: "s3",
    bucket: "mybucket",
    clientConfig: { region: "us-east-1" }
  },
  defaultTarget: "remote"  // default is S3; override per call with { target: "local" }
}

ℹ️ Override the default per call with { target: "local" } or { target: "remote" }.


πŸ“¦ Starchive Core Methods

Method Description Sync/Async
put({ key, data, target?, remoteAlias?, bucket?, prefix?, absolute?, contentType?, filename?, tags?, encrypt?, extra? }, actionInfo?, clientAuth?) Upload a buffer/stream/string. Records metadata (incl. { provider, key, bucket, alias } for S3). βš™οΈ Async
putFile({ key, path, target?, remoteAlias?, bucket?, prefix?, absolute?, contentType?, filename?, tags?, encrypt?, extra? }, actionInfo?, clientAuth?) Upload from a local file path. βš™οΈ Async
putMany(entries, { target?, remoteAlias?, bucket?, concurrency?, prefix?, absolute? }, actionInfo?, clientAuth?) Batch upload buffers/files. Returns { complete, incomplete, records, total }. βš™οΈ Async
getStream(key, { target?, remoteAlias?, bucket?, prefix?, absolute? }) Get an object as a readable stream. βš™οΈ Async
getStreamRange(key, start, end, { target?, remoteAlias?, bucket?, prefix?, absolute? }) Stream a byte range of an object. βš™οΈ Async
head(key, { target?, remoteAlias?, bucket?, prefix?, absolute? }) Get object headers/metadata. βš™οΈ Async
exists(key, { target?, remoteAlias?, bucket?, prefix?, absolute? }) Check if an object exists. βš™οΈ Async
remove(key, { target?, remoteAlias?, bucket?, record?, reason?, prefix?, absolute?, actionInfo?, clientAuth? }) Delete an object; optionally soft/hard-delete matching records. βš™οΈ Async
removeMany(keys, { target?, remoteAlias?, bucket?, record?, reason?, prefix?, absolute?, actionInfo?, clientAuth? }) Delete multiple objects; optionally soft/hard-delete records. βš™οΈ Async
copy(srcKey, dstKey, { target?, remoteAlias?, bucket?, prefix?, absolute? }) Copy an object. βš™οΈ Async
move(srcKey, dstKey, { target?, remoteAlias?, bucket?, prefix?, absolute? }) Move (copy+delete) an object. βš™οΈ Async
list({ target?, remoteAlias?, bucket?, prefix?, maxKeys?, continuationToken?, startAfter?, timeoutMS? }) List objects with pagination. βš™οΈ Async
listAll({ target?, remoteAlias?, bucket?, prefix?, pageSize?, timeoutMS? }) List all objects under a prefix. βš™οΈ Async
walk({ target?, remoteAlias?, bucket?, prefix? }) Async generator to recursively walk files/prefixes. βš™οΈ Async

✍️ Starchive Convenience Methods

Method Description Sync/Async
write(key, data, { target?, remoteAlias?, bucket?, prefix?, absolute?, contentType?, filename?, tags?, extra?, actionInfo?, clientAuth? }) Wrapper over put for buffers/strings; infers filename. βš™οΈ Async
writeText(key, text, opts?) Write UTF-8 text (content type set automatically). βš™οΈ Async
writeJSON(key, obj, { pretty?, ...opts }) Serialize and write JSON. βš™οΈ Async
read(key, opts?) Read entire object into a Buffer. βš™οΈ Async
readText(key, opts?) Read object as UTF-8 string. βš™οΈ Async
readJSON(key, opts?) Read and parse JSON (returns null on empty/invalid JSON). βš™οΈ Async
stat(key, opts?) Returns { size, lastModified, contentType } derived from head. βš™οΈ Async

πŸ›°οΈ Remote Management Helpers

Method Description
listRemotes(opts?) Returns the configured remotes. Pass { asObject: true } to get an object keyed by alias.
getRemoteDefaultAlias() Get the current default remote alias.
setRemoteDefaultAlias(alias) Set/switch the default remote alias at runtime.

πŸ” Starchive Signing & Presigning

Method Description Sync/Async
sign.getDetails(fileID, { method = "GET", expiresInMs = 900000 }) Create an internal HMAC signature payload { fileID, method, exp, sig }. βœ… Sync
sign.verify({ id, m, e, s }) Verify payload against the current signing key and expiry. βœ… Sync
presign.get(key, { target?, remoteAlias?, bucket?, ttlSeconds?, responseContentType?, responseContentDisposition?, timeoutMS?, prefix?, absolute? }) Generate S3 presigned GET URL (remote only). βš™οΈ Async
presign.put(key, { target?, remoteAlias?, bucket?, ttlSeconds?, contentType?, cacheControl?, contentDisposition?, tagging?, timeoutMS?, prefix?, absolute? }) Generate S3 presigned PUT URL (remote only). βš™οΈ Async
presign.getURL(key, opts?) Alias of presign.get. βš™οΈ Async
presign.putURL(key, opts?) Alias of presign.put. βš™οΈ Async

πŸ” Starchive Downloading

Method Description Sync/Async
download.buffer(key, { target?, remoteAlias?, bucket?, timeoutMS? }) Download file to Buffer. βš™οΈ Async
download.file(key, outPath, { target?, remoteAlias?, bucket?, timeoutMS? }) Download file to disk. βš™οΈ Async

πŸ“œ Starchive Records

Method Description Sync/Async
records.getByID(id, actionInfo?) Fetch the stored file record by ID. βœ… Sync
records.update(id, updates, actionInfo?, clientAuth?) Update metadata fields on a file record. βš™οΈ Async
records.deleteByID(id, { softDelete?, reason? }, actionInfo?, clientAuth?) Soft or hard delete a record by ID. βš™οΈ Async
records.deleteByQuery(queryFn, { softDelete?, reason? }, actionInfo?, clientAuth?) Delete/soft-delete many records matching a predicate. βš™οΈ Async

🎧 Event Listening

Used for reactive, event-driven architecture patterns.

Method Description Sync/Async
listen(event, nodePath, callback) Registers a callback for a specific event (create, update, delete) at a given path. βœ… Sync
emit(event, nodePath, data) Triggers callbacks for listeners whose paths match the emitted path. βœ… Sync

🌌 Collection & Path Matching

Utilities for dynamic collection operations and wildcard paths.

Method Description Sync/Async
getMatchingCollections(basePath) Resolves wildcard-based paths like logs/*/2025 to real collection names. βœ… Sync
matchesPath(listenerPath, nodePath) Checks if an emitted node path matches a listener's wildcard path. βœ… Sync

🌌 StarVault Events

StarVault emits real-time events that let you react to data and authentication lifecycle changes across your app. These include both record-level events and auth lifecycle events.

You can listen to them at multiple levels of granularity:

  • πŸ” Global listeners (across all collections and records)
  • πŸ“ Collection-level listeners (any record in a collection)
  • 🧾 Record-specific listeners (a specific record path)

πŸ”” Emitted Record Events (StarVault Core)

Event Description Emitted Path
create Fires on record creation. collectionName/recordID
update An existing record updated collectionName/recordID
delete A record got deleted (soft or hard) collectionName/recordID

πŸ” Emitted Auth Lifecycle Events (StarAuth)

Event Description
guest:upgraded A guest account successfully upgraded to a full user
guest:updated A guest account successfully updated
user:updated A user account successfully updated
session:resumed A user session resumed from a valid token
user:guestExpired A guest account expired due to inactivity
user:deleted A user account got marked for deletion
user:reactivated A previously deleted user got reactivated

πŸ”” StarTransaction Lifecycle Events

Event Description Payload
tx:commit Fires after transaction commit and data application. { count, startedAt, endedAt }
tx:abort Fires when transaction aborts manually or through error. { reason }
tx:summary Fires after a transaction successfully commits and finalizes all operations. Ideal for analytics, dashboards, or external monitoring. { transactionID, ops, startedAt, endedAt }

πŸͺ Global Listener (All Changes Across Vault)

vault.listen("create", "*", (path, data) => {
     console.log("Created:", path, data);
});

vault.listen("update", "*", (path, data) => {
     console.log("Updated:", path, data);
});

vault.listen("delete", "*", (path, data) => {
     console.log("Deleted:", path, data);
});

πŸ“‚ Collection-Level Listener

vault.listen("create", "users/*", (path, data) => {
     console.log("User created:", path, data);
});

vault.listen("update", "inventory/*", (path, data) => {
     console.log("Inventory updated:", path, data);
});

🧍 Record-Specific Listener

vault.listen("update", "orders/12345", (path, data) => {
     console.log("Order updated:", data);
});

vault.listen("delete", "accounts/user-abc", (path, data) => {
     console.log("User deleted:", data);
});

🎯 Advanced Wildcard Usage

// Match nested logs by year
vault.listen("update", "logs/*/2025/*", (path, data) => {
     console.log("Log updated:", path);
});

🧠 Listening to StarAuth Lifecycle Events

Use .on() to subscribe to StarAuth-specific events:

vault.on("guest:upgraded", (info) => {
     console.log("Guest upgraded:", info);
});

vault.on("user:deleted", (info) => {
     console.log("User deleted:", info);
});

vault.on("user:reactivated", (info) => {
     console.log("User reactivated:", info);
});

πŸ”” Listening to StarTransaction Lifecycle Events

vault.listen("tx:commit", "*", (id, info) => {
     console.log("Committed txn:", id, info);
});

vault.listen("tx:abort", "*", (id, info) => {
     console.log("Aborted txn:", id, info);
});

vault.on("tx:summary", (transactionID, summary) => {
    console.log("Transaction Summary:", transactionID, summary);
});

These event hooks power real-time dashboards, activity tracking, notifications, and custom automation β€” all deeply integrated with StarVault's reactive system.


✨ Getting Started

πŸ“¦ Installation

npm install @trap_stevo/star-vault

Basic Usage

const StarVault = require("@trap_stevo/star-vault");

const vault = new StarVault(
     "./data",
     "./logs",
     4,
     "869MB",
     "1w",
     {
          enableEncryption : true,
          masterKey : "supersecretkey",
          authHandler : (auth) => auth.token === "valid-token"
     }
);

vault.create("users", { id : "001", name : "Nova" }, { source : "init" }, { token : "valid-token" });

πŸ“ˆ Querying

const results = vault.query("users")
     .where({ role : "admin" })
     .sort({ name : 1 })
     .select(["id", "name"])
     .limit(10)
     .execute();

🎧 Listening to Changes

vault.listen("create", "*", (path, data) => {
     console.log("[CREATE - ANY] Path:", path, data);
});

vault.listen("create", "users/*", (path, data) => {
     console.log("[CREATE - users] Path:", path, data);
});

vault.listen("update", "users/*", (path, data) => {
     console.log("[UPDATE - users] Path:", path, data);
});

// Listen for updates to a specific user record (e.g., user ID '001')
vault.listen("update", "users/user-001", (path, data) => {
     console.log("[UPDATE - users/user-001] Path:", path, data);
});

vault.listen("delete", "users/*", (path, data) => {
     console.log("[DELETE - users] Path:", path, data);
});

vault.listen("delete", "logs/*/2025", (path, data) => {
     console.log("[DELETE - logs/*/2025] Path:", path, data);
});

// Listen for a specific log record inside a structured path (e.g., logs/server1/2025/log-99)
vault.listen("create", "logs/server1/2025/log-99", (path, data) => {
     console.log("[CREATE - logs/server1/2025/log-99] Path:", path, data);
});

// Listen to everything happening in 'auth-sessions'
vault.listen("create", "auth-sessions", (path, data) => {
     console.log("[CREATE - auth-sessions] Path:", path, data);
});

vault.listen("update", "auth-sessions", (path, data) => {
     console.log("[UPDATE - auth-sessions] Path:", path, data);
});

vault.listen("delete", "auth-sessions", (path, data) => {
     console.log("[DELETE - auth-sessions] Path:", path, data);
});

🌐 Wildcard Collection Queries

vault.query("logs/*/2025")
     .recent("timestamp", "7d")
     .execute();

πŸ‘₯ Registering Users (Guest and Normal)

const StarVault = require("@trap_stevo/star-vault");

const vault = new StarVault(
     "./data",
     "./logs",
     4,
     "869MB",
     "1w",
     {
          enableEncryption : true,
          masterKey : "supersecretkey",
          authHandler : (auth) => auth.token === "star-vault-demo",
          authOptions : {
               allowGuestSessions : true,
               generateGuestID : () =>  "guest-" + Math.floor(Math.random() * 1000000)
          }
     }
);

// Register a full user
const userResult = await vault.registerUser("nova@example.com", "strongpassword123", { source : "site" }, { token : "star-vault-demo" });
console.log("Registered user:", userResult);

// Register a guest user
const guestResult = await vault.registerGuestUser({ ip : "127.0.0.1" }, { referrer : "home" }, { source : "guest-form" }, { token : "star-vault-demo" });
console.log("Registered guest:", guestResult);

πŸ“‹ Listing Users and Sessions

const StarVault = require("@trap_stevo/star-vault");

const vault = new StarVault(
     "./data",
     "./logs",
     4,
     "869MB",
     "1w",
     {
          enableEncryption : true,
          masterKey : "supersecretkey",
          authHandler : (auth) => auth.token === "star-vault-demo"
     }
);

// List all users
const users = await vault.listUsers({}, { limit : 25 }, { token : "star-vault-demo" });
console.log("All users:", users);

// List all sessions (including inactive and deleted)
const sessions = await vault.listAllSessions({ includeDeleted : "only" }, true, { token : "star-vault-demo" });
console.log("All sessions:", sessions);

// List sessions for a specific user
const userSessions = await vault.listSessions("user-001", { device : "mobile" }, false, { token : "star-vault-demo" });
console.log("Sessions for user-001:", userSessions);

// List recent user activity (active and inactive)
const activity = await vault.listUserActivity({
     includeInactive : true,
     onlyMostRecent : true
}, { token : "star-vault-demo" });

console.log("User activity:", activity);

πŸ” Quick Starchive Examples

1. Store & Retrieve a File

await vault.starchive.putFile({
  key: "uploads/photo.png",
  path: "./photo.png",
  target: "remote"
});

const exists = await vault.starchive.exists("uploads/photo.png");
console.log("Uploaded?", exists);

2. Write and Read JSON

await vault.starchive.writeJSON("configs/app.json", { theme: "dark" });
const cfg = await vault.starchive.readJSON("configs/app.json");
console.log("Loaded config:", cfg);

3. Batch Upload (Buffers + Files)

const results = await vault.starchive.putMany([
  { key: "docs/a.txt", buffer: Buffer.from("Alpha") },
  { key: "docs/b.txt", path: "./local-b.txt" }
], { target: "remote" });

console.log("Completed:", results.complete.length);

4. Presigned Upload (Client-Side)

const url = await vault.starchive.presign.put("uploads/user.txt", {
  contentType: "text/plain",
  ttlSeconds: 300
});
console.log("Upload directly to:", url);

5. Streaming Download

const stream = await vault.starchive.getStream("uploads/photo.png");
stream.pipe(fs.createWriteStream("./downloaded.png"));

6. Range Request (Video Streaming)

const part = await vault.starchive.getStreamRange("videos/movie.mp4", 0, 1024*1024);
part.stream.pipe(fs.createWriteStream("./clip.mp4"));

7. Directory Walk

for await (const node of vault.starchive.walk({ prefix: "reports/2025/" })) {
  console.log(node.type, node.key);
}

8. Metadata & Stat

const info = await vault.starchive.stat("uploads/photo.png");
console.log(info.size, info.lastModified, info.contentType);

9. Record Management

const rec = await vault.starchive.records.getByID("file-123");
await vault.starchive.records.updateFields("file-123", { tags: ["archive"] });
await vault.starchive.records.deleteByID("file-123", { softDelete: true });

10. Copy & Move

await vault.starchive.copy("docs/a.txt", "docs/a-copy.txt");
await vault.starchive.move("docs/b.txt", "docs/b-archived.txt");

✨ License

See License in LICENSE.md


πŸš€ Transform Data into Action

Star-Vault transcends traditional data systemsβ€”offering a full-fledged database engine and cosmic foundation that propels secure, reactive, and intelligent data-driven architectures.