1 Estructura
SITO edited this page 2026-08-19 20:48:19 +02:00

Cómo está organizado el código

⚠ Rama experimental, no oficial. El Oasis oficial es https://github.com/epsylon/oasis · Volver a la portada

Esta rama tiene que hacer dos cosas a la vez: añadir funciones y seguir el ritmo de epsylon, que publica una versión cada pocos días. Lo segundo solo sale bien si el código propio se distingue del suyo y no le estorba.

Esta página explica dónde vive cada cosa y por qué ahí.


La regla

Upstream no usa ni un solo subdirectorio en src/views, src/backend, src/models, src/client/assets/styles ni src/client/assets/translations: 66 vistas y 67 modelos, todos planos. La rama sigue esa misma forma. Nada de carpetas propias.

Y los nombres, los suyos: *_model.js para modelos, *_view.js para vistas, *_views.js cuando son varias.

Los diez ficheros propios

Fichero Qué es A qué se parece en upstream
src/models/karvan_model.js Las salas efímeras y su ciclo de vida polls_model.js
src/views/karvan_view.js La lista de salas y la sala chats_view.js
src/backend/karvan_routes.js Las rutas del módulo — (ver abajo)
src/client/public/js/karvan.js El cliente WebRTC del navegador pdf-viewer.js
src/client/assets/styles/karvan.css Los estilos del módulo highlight.css
src/views/hive_views.js El panal, la topbar y la barra inferior main_views.js
src/views/identities_view.js El selector de identidades cualquier *_view.js
src/backend/accounts.js Encontrar y elegir identidades nameCache.js
src/backend/turnCredentials.js Credenciales efímeras para TURN wallet_addresses.js
src/client/assets/translations/i18n_fork.js Los textos de la rama junto a i18n.js

Y lo que se toca de lo suyo

+247 líneas repartidas en 21 ficheros — una media de once líneas por fichero. Casi todo son enganches de una línea:

// main_views.js: la interfaz de móvil se llama, no se escribe aquí
const forkNav = require('./hive_views')({ i18n });

La excepción es OasisMobile.css, con unas mil líneas: es el tema de la rama, y un tema es un fichero entero por definición.

Las tres decisiones que no son obvias

Por qué las rutas van aparte

Upstream mete 625 rutas en backend.js, en una sola cadena. Ese fichero se reescribe en cada versión: +833/-286 líneas en la 0.9.2, +266/-31 en la 0.9.1.

Una ruta añadida en medio de esa cadena entra en conflicto cada vez. Por eso las del módulo viven en karvan_routes.js, montadas en un router propio que se inserta antes del de upstream: lo que no casa cae a next() y sigue su curso.

Es la única pieza que no imita una existente, y por un motivo medible.

Por qué la interfaz de móvil está en un fichero suelto

hive_views.js no se limita a agrupar: existe para que main_views.js no crezca. Ese fichero cambia mucho entre versiones, y tener el panal dentro obligaría a rehacerlo en cada integración.

Sus tres funciones empiezan igual:

if (process.env.OASIS_MOBILE !== '1') return "";

Así el mismo main_views.js sirve para las dos ramas: en escritorio no dibujan nada. Por eso OASIS_LINUX puede llevarlo idéntico sin heredar la interfaz de móvil.

Por qué las traducciones son un overlay

Upstream tiene once ficheros oasis_XX.js y los reescribe enteros en cada versión. Añadir claves dentro significaría perderlas cada vez.

i18n_fork.js las lleva aparte y i18n.js las mezcla con un enganche de tres líneas:

try {
  const overlay = require('./i18n_fork.js');
  languages.forEach(l => Object.assign(i18n[l] = i18n[l] || {}, overlay[l] || overlay.en || {}));
} catch (e) {}

Dentro va solo lo de la rama. Los nombres de las categorías, por ejemplo, no están: son los de epsylon y se leen de los suyos.


Lo que se ha quitado por sobrar

Revisando esto salieron cosas que no deberían haber estado:

Qué Por qué sobraba
views/fork/ y translations/fork/ Subdirectorios propios; upstream no tiene ninguno
Una segunda ruta /legacy/export Copia exacta de la del dev, en otro fichero
media-favorites.js y su JSON De una versión anterior; nadie lo requería
El campo subtopic en el foro Resto de unos subtemas propios que se descartaron

Los subtemas de verdad son los de upstream, con sus rutas y sus vistas.


Cómo comprobarlo

Contra un clon de upstream de la misma versión:

# ficheros propios de la rama
for d in src/backend src/models src/views; do
  diff <(ls ../oasis/$d) <(ls $d) | grep '^>'
done

# subdirectorios que upstream no tiene (no debería salir ninguno)
find src/views src/backend src/models -maxdepth 1 -type d | tail -n +2

# líneas añadidas sobre cada fichero suyo
for f in $(git ls-files 'src/**/*.js'); do
  [ -f ../oasis/$f ] && n=$(diff ../oasis/$f $f | grep -c '^>') && [ $n -gt 0 ] && echo "$n $f"
done | sort -rn