Los desarrolladores de SQLite están desarrollando un proyecto para implementar la capacidad de compilar la biblioteca en un código WebAssembly intermedio que puede ejecutarse en un navegador web y es adecuado para organizar el trabajo con la base de datos desde aplicaciones web en el lenguaje JavaScript.
El objetivo del proyecto es proporcionar un enlace de JavaScript funcional que sea idéntico en funcionalidad a la API de SQLite. Los desarrolladores web cuentan con una interfaz orientada a objetos de alto nivel para trabajar con datos al estilo de sql.js o Node.js, envolviendo una API C de bajo nivel y una API basada en el mecanismo Web Worker que permite para crear controladores asincrónicos que se ejecutan en hilos separados.
Para ocultar las complejidades de organizar el trabajo con subprocesos sobre la API basada en Web Worker, también se está desarrollando una variante de la interfaz de programación basada en el mecanismo Promise.
Los datos que las aplicaciones web almacenan en la versión WASM de SQLite pueden localizarse dentro de la sesión actual (perderse después de recargar la página) o persistir en el lado del cliente (persistir entre sesiones).
Para el almacenamiento permanente, se han preparado backends para colocar datos en un sistema de archivos local utilizando OPFS (Origin-Private FileSystem, extensióna la API de acceso al sistema de archivos, actualmente solo disponible en navegadores basados en WebKit y Chromium) y almacenamiento local del navegador basado en las API window.localStorage y window.sessionStorage.
Cuando se usa localStorage/sessionStorage, los datos se asignan a los almacenamientos de clave/valor apropiados, mientras que cuando se usa OPFS, hay dos opciones: simular un FS virtual usando WASMFS y una implementación separada de sqlite3_vfs que ofrece una capa SQLite VFS basada en OPFS.
El compilador Emscripten se usa para construir SQLite en una representación WASM. El resultado son los archivos sqlite3.js y sqlite3.wasm que puede incluir en su proyecto de JavaScript (ejemplo de HTML y JavaScript).
De los objetivos en concreto de este proyecto se mencionan:
Excepto donde se indique en los no objetivos, proporcione un envoltorio más o menos completo de características para la API C de sqlite3, en la medida en que lo permita la paridad de características de WASM con C. De hecho, proporcione al menos las siguientes API.
- Vincule una API sqlite3 de bajo nivel que sea lo más cercana posible a la nativa en términos de uso.
- Una API OO de nivel superior, más parecida a las implementaciones de estilo sql.js y node.js.
- Una API basada en trabajadores que se comunica con las API anteriores a través de mensajes de trabajadores. Este está diseñado para usarse en el subproceso principal, con las API de nivel inferior instaladas en un subproceso de Worker y comunicarse con ellas a través de mensajes de Worker.
- Una variante basada en Promise de Worker API que oculta por completo los aspectos de comunicación entre subprocesos del usuario.
- En la medida de lo posible, admita el almacenamiento persistente del lado del cliente utilizando las API de JS disponibles. Al momento de escribir este artículo, eso incluye el sistema de archivos privado de origen (OPFS) y el almacenamiento (muy limitado) a través de los backends window.localStoragey .window.sessionStorage
En cuanto a los objetivos no específicos:
- Como WASM es una tecnología centrada en la web y UTF-8 es el rey de las codificaciones en ese ámbito, no hay planes actuales para admitir las API sqlite3 relacionadas con UTF16.
- Aunque la compatibilidad con los tiempos de ejecución de WASM fuera del navegador está muy extendida, este proyecto actualmente (finales de 2022) se centra solo en los objetivos del navegador. Aunque los detalles de implementación relacionados con la web tienen prioridad, y los componentes de JavaScript de la API se centran específicamente en los clientes del navegador, el módulo WASM de nivel inferior «debería» funcionar en entornos WASM que no sean web.
- Compatibilidad con plataformas antiguas o de nicho de mercado. WASM está diseñado para una web moderna y requiere plataformas modernas. Del mismo modo, las opciones de la biblioteca sqlite3 que han quedado en desuso se eliminarán por completo de la interfaz WASM.
El código para la compatibilidad con WebAssembly se ha agregado al repositorio principal del proyecto. A diferencia de la API de WebSQL, que se basa en SQLite, WASM SQLite está completamente aislado del navegador y no afecta su seguridad (Google decidió dejar de admitir WebSQL en Chrome después de varias vulnerabilidades en SQLite que podrían explotarse a través de WebSQL para atacar el navegador).
Finalmente si estás interesado en poder conocer mas al respecto, puedes consultar los detalles en el siguiente enlace.