estructura: los ficheros de la rama, donde los pondria el dev

Upstream no usa ni un solo subdirectorio en src/views, src/backend, src/models,
src/client/assets/styles ni translations: todo plano. La rama habia creado dos
(views/fork/ y translations/fork/), que es lo que mas se separaba de su forma de
organizar el codigo. Se deshacen, y los ficheros pasan a llamarse como los suyos:

  views/fork/hive_nav.js          -> views/hive_views.js      (como main_views.js)
  views/fork/identities.js        -> views/identities_view.js (como *_view.js)
  translations/fork/i18n_fork.js  -> translations/i18n_fork.js (junto a i18n.js)
  backend/fork_routes.js          -> backend/karvan_routes.js (familia karvan_*)

Ademas se retira una ruta duplicada: /legacy/export estaba declarada dos veces,
en backend.js (la del dev) y en el fichero de rutas de la rama, con el mismo
cuerpo salvo un && defensivo. Nacio cuando el formulario se paso a GET; al
devolverlo a POST quedo como copia exacta. Con ella se van legacyModel y
onboardingModel, que ya no hacia falta inyectar.

La cabecera del fichero de rutas explica ahora por que sigue existiendo, con los
datos medidos y no de memoria: backend.js concentra 625 rutas y se reescribe en
cada release (+833/-286 en la 0.9.2, +266/-31 en la 0.9.1), asi que una ruta
anadida en medio entra en conflicto cada vez.

Quedan diez ficheros propios, todos siguiendo la convencion de upstream, y
+247 lineas repartidas en 21 ficheros suyos (sin contar OasisMobile.css, que es
el tema de la rama).

Comprobado tras mover: arranque, las siete rutas principales, el selector de
identidades con sus siete entradas y su aviso, crear sala y enviar mensaje en
Karvan, y la exportacion de identidad por la ruta del dev.
This commit is contained in:
SITO 2026-08-19 20:38:26 +02:00
parent 6ee8b77639
commit 9cadc45c1d
8 changed files with 22 additions and 36 deletions

View file

@ -9442,8 +9442,8 @@ const middleware = [
await next();
},
// rutas propias de la rama (Karvan, barra inferior, exportacion): fuera de la cadena de upstream
require('./fork_routes')({ cooler, pull, pmModel, checkMod, getViewerId,
getConfig, saveConfig, legacyModel, onboardingModel,
require('./karvan_routes')({ cooler, pull, pmModel, checkMod, getViewerId,
getConfig, saveConfig,
isLoopbackRequest, sendErrorPage }),
routes,
];

View file

@ -1,12 +1,15 @@
"use strict";
// Rutas propias de la rama experimental (modulo Karvan: salas efimeras en RAM,
// mensajes temporales y senalizacion WebRTC).
// Rutas del modulo Karvan (salas efimeras en RAM, mensajes temporales y
// senalizacion WebRTC), mas las dos pantallas que la rama anade a los ajustes.
//
// Viven fuera de backend.js a proposito: ese fichero concentra las 577 rutas de
// upstream en una sola cadena fluida y se mueve +905/-298 lineas por release, asi
// que cualquier ruta anadida en medio entra en conflicto en cada integracion.
// Aqui se montan en un router propio que se inserta en la cadena de middleware
// antes del router de upstream; lo que no casa cae a next() y sigue su curso.
// Upstream pone todas sus rutas en backend.js: 625 en una sola cadena fluida.
// Estas viven aparte porque ese fichero se reescribe entero en cada release
// (+833/-286 en la 0.9.2, +266/-31 en la 0.9.1), asi que una ruta anadida en
// medio entra en conflicto cada vez. Se montan en un router propio insertado
// antes del de upstream; lo que no casa cae a next() y sigue su curso.
//
// El nombre sigue a la familia del modulo: karvan_model.js, karvan_view.js,
// karvan.js, karvan.css.
//
// Las dependencias se inyectan en lugar de reconstruirse: cooler abre la conexion
// al sbot y duplicarla abriria un segundo cliente muxrpc.
@ -19,8 +22,7 @@ const karvanModel = require('../models/karvan_model')({}); // FORK_IA_UX: salas
const { karvanView, karvanRoomView } = require("../views/karvan_view");
module.exports = ({ cooler, pull, pmModel, checkMod, getViewerId,
getConfig, saveConfig, legacyModel, onboardingModel,
isLoopbackRequest, sendErrorPage }) => {
getConfig, saveConfig, isLoopbackRequest, sendErrorPage }) => {
// FORK_IA_UX Fase 2 (cross-device): relay de MENSAJES de Karvan por privados SSB. Funciona vía un pub
// (el privado se replica al otro móvil); los SIGNAL de WebRTC NO se relayan (serían demasiados/lentos por el log).
// No toca el arranque del SSB. Ingesta por stream EN VIVO (no polling) → eficiente.
@ -213,22 +215,6 @@ async function karvanInviteAuthor(roomId) {
// que es quien sabe como hacerlo. Basta con anotarla y reiniciar.
accounts.setActive(name);
ctx.redirect('/settings');
})
// POST y no GET: en la direccion, la contraseña acaba en el historial del
// navegador, en el registro del servidor y en el Referer de lo siguiente que
// se cargue. En el cuerpo, no.
.post('/legacy/export', koaBody(), async (ctx) => {
if (!isLoopbackRequest(ctx)) { ctx.status = 403; ctx.body = ''; return; }
const pw = ctx.request.body && ctx.request.body.password;
if (!pw || pw.length < 32) return ctx.redirect('/legacy');
try {
const { filename, data } = await legacyModel.exportData({ password: pw });
ctx.set('Content-Type', 'application/octet-stream');
ctx.set('Content-Disposition', `attachment; filename="${filename}"`);
ctx.set('Content-Length', String(data.length));
ctx.body = data;
try { onboardingModel.markStep('backup'); } catch (_) {}
} catch (error) { sendErrorPage(ctx, error.message); }
});
return forkRouter.routes();

View file

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

View file

@ -7,9 +7,9 @@
// cada integracion. Aqui solo depende de i18n, que se inyecta porque main_views
// lo muta en cada peticion sin reasignarlo.
const { a, button, div, form, h2, h3, img, input, label, nav, p, section, span } = require("../../server/node_modules/hyperaxe");
const { getConfig } = require("../../configs/config-manager.js");
const sharedState = require("../../configs/shared-state");
const { a, button, div, form, h2, h3, img, input, label, nav, p, section, span } = require("../server/node_modules/hyperaxe");
const { getConfig } = require("../configs/config-manager.js");
const sharedState = require("../configs/shared-state");
module.exports = ({ i18n }) => {
// === Oasis UX (portado de 0.8.7_UX): topbar + bottombar + hive ===

View file

@ -10,7 +10,7 @@
module.exports = ({ i18n, html }) => {
const { form, button, div, h2, p, section, input, span, ul, li, a } = html;
const accounts = require('../../backend/accounts.js');
const accounts = require('../backend/accounts.js');
const renderIdentities = (activeAccount) => {
const names = accounts.list();

View file

@ -1190,9 +1190,9 @@ const renderTasksLink = () => {
};
// === Oasis UX: topbar + bottombar + hive ===
// La implementacion vive en ./fork/hive_nav.js para que las reescrituras de
// La implementacion vive en ./hive_views.js para que las reescrituras de
// upstream sobre este fichero no arrastren la interfaz de la rama.
const forkNav = require('./fork/hive_nav')({ i18n });
const forkNav = require('./hive_views')({ i18n });
const renderMobileTopbar = forkNav.renderMobileTopbar;
const renderBottomBar = forkNav.renderBottomBar;
const renderHiveNav = forkNav.renderHiveNav;

View file

@ -6,8 +6,8 @@ const { template, selectedLanguage, i18n, setLanguage } = require('./main_views'
const i18nBase = require("../client/assets/translations/i18n");
const { WORKFLOWS, currentWorkflow } = require('../models/workflows_model');
const html = require("../server/node_modules/hyperaxe");
// selector de identidades: la implementacion vive en ./fork/identities.js
const { renderIdentities } = require('./fork/identities')({ i18n, html });
// selector de identidades: la implementacion vive en ./identities_view.js
const { renderIdentities } = require('./identities_view')({ i18n, html });
const snhUrl = "https://wiki.solarnethub.com/socialnet/overview";