npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

jun-db

v1.0.2

Published

Minimalist NoSQL sharded database for Node.js. High-performance binary storage that feels like a native JS object via transparent Proxies. Zero dependencies and atomic I/O.

Downloads

244

Readme

Jun-DB

Jun-DB es un sistema de persistencia de datos NoSQL diseñado para Node.js que opera mediante la intercepción de operaciones de lenguaje a través de Proxies nativos. El sistema transforma estructuras de objetos de JavaScript en un grafo de datos persistente, utilizando serialización binaria V8 y una estrategia de fragmentación recursiva (sharding) para optimizar el uso de memoria y la velocidad de acceso.


Características fundamentales

  • Persistencia Transparente: Sincronización automática mediante Proxies nativos.
  • Sharding Recursivo: Fragmentación de estructuras complejas con soporte de carga perezosa (lazy loading).
  • Integridad de Datos: Escritura atómica mediante archivos temporales y fsync.
  • Gestión de Memoria: Caché LRU gestionada por tamaño real en bytes de los objetos serializados.
  • Implementación Nativa: Cero dependencias externas; basado en módulos fs, v8 y crypto.

Documentación Técnica Avanzada

Para una comprensión profunda de la mecánica de persistencia, fragmentación recursiva y gestión de estado mediante Proxies, consulte la Definición Ontológica y Caracterización Estructural del Sistema.


Instalación

npm install jun-db

Limitaciones y Recomendaciones

Limitaciones técnicas:

  • Portabilidad: Datos restringidos al entorno Node.js debido a la serialización V8.
  • Concurrencia: Soporte exclusivo para un único proceso activo; riesgo de corrupción en accesos multiproceso.
  • E/S Síncrona: El acceso inicial a fragmentos puede bloquear el event loop brevemente en archivos extensos.
  • Recursos de FS: Riesgo de agotamiento de inodos ante configuraciones de fragmentación excesiva.
  • Consultas: Recuperación limitada a acceso por claves jerárquicas; no incluye motor de búsqueda indexada.
  • Estado Puro: No se persisten funciones ni prototipos, únicamente el estado de los datos.

Recomendaciones de uso:

  • Estructura: Preferir el anidamiento de objetos sobre listas planas masivas para maximizar la eficiencia de la carga perezosa.
  • Persistencia: Invocar siempre await db.flush() antes de finalizar el proceso para asegurar el vaciado de la cola de escritura.
  • Sharding: Mantener depth en niveles 2-3 para equilibrar la fragmentación y el rendimiento del sistema de archivos.
  • Entorno: Ejecutar sobre sistemas de archivos optimizados para grandes cantidades de archivos pequeños (Ext4, APFS).

Inicialización y Configuración

import { JunDB } from 'jun-db';

const db = new JunDB({
    folder: './data',     // Directorio base de almacenamiento
    depth: 2,             // Profundidad de subdirectorios para fragmentos
    memory: 20,           // Límite máximo de la caché RAM en MB
    index: { 
        threshold: 10,    // Mutaciones antes de forzar escritura del índice
        debounce: 5000    // Retardo (ms) para agrupamiento de operaciones del índice
    },
    nodes: { 
        threshold: 5,     // Mutaciones para forzar escritura de nodos de datos
        debounce: 3000    // Retardo (ms) para agrupamiento de operaciones de nodos
    }
});

Estructura de Almacenamiento

Jun-DB organiza la persistencia en archivos binarios distribuidos:

./data/
├── index.bin       # Mapa de fragmentos (anclado en RAM).
├── root.bin        # Objeto raíz del árbol.
└── data/           # Repositorio de fragmentos (sharding).
    └── A1/
        └── A1B2C3.bin  # Nodo de datos fragmentado.

Interfaz y Métodos de Instancia

El acceso a los datos se realiza a través de db.data, que actúa como punto de entrada reactivo.

// Escritura: Genera fragmentos y sincroniza automáticamente
db.data.user = { profile: { name: "Jun" } }; 

// Lectura: Carga perezosa desde disco al acceder a la propiedad
const name = db.data.user.profile.name;      

// Eliminación: Remueve claves y purga archivos físicos vinculados
delete db.data.user;                         

Métodos principales:

  • open(...path): Retorna un Proxy directo a una rama específica del árbol para optimizar el acceso.
  • flush(): Retorna una Promesa que garantiza la persistencia de todas las operaciones en cola.
  • memory(): Devuelve estadísticas de la caché LRU (uso, límites e ítems cargados).

Control de Flujo y Lógica Virtual

JunFlow (Middleware y Métodos locales)

Permite inyectar lógica de control en nodos específicos del árbol.

  • this.resolve(value): Retorna el valor y anula la persistencia automática (Override).
  • this.reject(error): Interrumpe la ejecución y lanza una excepción.
  • Ejecución por defecto: Si no se invoca control, el sistema procesa la persistencia estándar tras finalizar la función.
db.flow.set('usuarios', {
    $proxy: {
        set(target, key, value) {
            if (key === 'edad' && value < 18) {
                this.reject(new Error('Edad inválida'));
            }
        },
        delete(target, key) {
            if (key === 'protegido') this.resolve(false); 
        }
    },
    $call: {
        total() { return Object.keys(this.data).length; }
    }
});

Shared (Métodos Globales)

Funciones accesibles desde cualquier nivel del árbol de datos con menor precedencia que $call.

db.shared.info = function() {
    return { 
        keys: Object.keys(this.data).length, 
        file: this.index.$file 
    };
};

Contexto de ejecución (this): Tanto en JunFlow como en Shared, el contexto provee acceso a: this.data (proxy actual), this.index (mapa de shards), this.flow (configuración del nodo), this.open() y la instancia global this.Jun.


Inyección Jerárquica de Clases ($class)

Jun-DB permite la personalización de sus módulos internos mediante inyección de dependencias jerárquica. Para sobrescribir un componente interno, se debe seguir su ruta de acceso en la arquitectura.

Jerarquía de dependencias:

  • JunDBJunDrive, JunMap, JunFlow
    • JunDriveJunRAM
    • JunMapJunDoc
    • JunHub (vía Proxy) → JunShard, JunDoc

Ejemplo de configuración avanzada:

const db = new JunDB({
    $class: {
        // Inyección en JunDrive y su submódulo JunRAM
        JunDrive: [{ 
            folder: './custom_data',
            $class: { JunRAM: myCustomRamInstance }
        }],
        
        // Configuración personalizada de JunHub y JunShard
        JunHub: {
            $class: { JunShard: [3] }, // Profundidad de sharding 3
            file: { limit: 50, delay: 1000 }
        }
    }
});

Formatos de inyección:

  • Instancia: Vinculación directa del objeto.
  • Array ([...]): Los elementos se pasan como argumentos al constructor (new Class(...args)).
  • Object ({...}): Se pasa como opciones al constructor. Si incluye $class, el proceso se aplica recursivamente.

Licencia

Este proyecto está bajo la Licencia MIT.