diff --git a/CONTEXT/04_ARQUITECTURA.txt b/CONTEXT/04_ARQUITECTURA.txt index 1e6954df..bcb91c6e 100644 --- a/CONTEXT/04_ARQUITECTURA.txt +++ b/CONTEXT/04_ARQUITECTURA.txt @@ -1,5 +1,6 @@ =============================================================== ARQUITECTURA — OASIS MOBILE (Node.js) + Actualizado: 2026-05-02 | Version: 0.7.4 =============================================================== ENTRY POINT: @@ -10,52 +11,74 @@ ENTRY POINT: -------------------------------------------------------------- BACKEND (Koa.js) -------------------------------------------------------------- -ARCHIVO: src/backend/backend.js (3249 lineas, ~500 handlers) +ARCHIVO: src/backend/backend.js (~4127 lineas, 100+ handlers) - Router con 100+ rutas GET/POST - Carga todos los modelos al inicio - - Middleware: validacion host, idioma (cookies), SSB sync status + - Middleware: validacion host (CSRF), idioma (cookies), SSB sync status - Patron: ctx.body = await vistaView(datos) -RUTAS CLAVE: - GET / -> home / feed - GET /inhabitants -> lista de usuarios - GET /author/:id -> perfil de usuario - GET /tribes -> lista de tribes - POST /tribes/generate-invite -> genera invite code de tribe (con inviteLog) - POST /tribes/join-code -> unirse a tribe con codigo (actualiza inviteLog) - GET /invites -> pagina de invites/pubs SSB - POST /settings/invite/accept -> acepta pub invite + publica SSB msg - GET /wallet -> wallet ECOin - GET /wallet/receive -> recibir (tiene QR de direccion) - GET /blockchain -> blockchain explorer (SSB log) - GET /AI -> integracion IA - GET /parliament -> gobernanza - GET /market -> mercado - GET /courts -> tribunales - GET /banking -> banca ECOin +RUTAS VERIFICADAS (HTTP 200 confirmado 2026-05-02): + GET / -> home (302 redirect a /activity) + GET /activity -> feed de actividad + GET /inhabitants -> lista de usuarios + GET /tribes -> list de tribes + GET /invites -> invites/pubs SSB + GET /peers -> peers conectados + GET /blockexplorer -> blockchain explorer SSB (NO es /blockchain) + GET /settings -> configuracion + GET /modules -> activar/desactivar modulos + GET /search -> busqueda + GET /banking -> banca ECOin + GET /market -> mercado + GET /chats -> chats directos + GET /pads -> pads colaborativos + GET /games -> 16 juegos en JS + GET /maps -> mapas con tiles offline + GET /shops -> tiendas + GET /torrents -> torrents + GET /calendars -> calendarios + GET /logs -> logs del sistema + GET /AI -> integracion IA (302 redirect) + + POST /settings/invite/accept -> acepta pub invite SSB + -> Requiere header Referer (CSRF protection) + -> Publica SSB msg type:'pub-invite' con pubHost, pubKey, acceptedAt + POST /tribes/generate-invite -> genera invite code (con inviteLog) + POST /tribes/join-code -> unirse a tribe -------------------------------------------------------------- MODELOS (src/models/) -------------------------------------------------------------- - about_model.js -> perfiles de usuario - tribes_model.js -> tribes + inviteLog trazabilidad completa - - generateInvite(tribeId) -> registra en inviteLog[] con generatedBy - - joinByInvite(code, userId) -> actualiza inviteLog (status, usedBy, usedAt) - - getTribeById() / listAll() -> exponen inviteLog - main_models.js -> acceptInvite() -> publica SSB msg type:'pub-invite' - blockchain_model.js -> listBlockchain() con filtro 'invites' - courts_model.js, banking_model.js, parliament_model.js, ... - (30+ modelos en total) + MODELOS CORE: + about_model.js -> perfiles de usuario + main_models.js -> SSB core: peers, acceptInvite, rebuild + blockchain_model.js -> listBlockchain() con filtros por tipo + tribes_model.js -> tribes + inviteLog trazabilidad completa + - generateInvite(tribeId) -> registra en inviteLog[] con generatedBy + - joinByInvite(code, userId) -> actualiza inviteLog (status, usedBy, usedAt) + + MODELOS NUEVOS (upstream 0.7.4): + calendars_model.js, chats_model.js, games_model.js, logs_model.js + maps_model.js, pads_model.js, shops_model.js, torrents_model.js + viewer_filters.js, tribe_crypto.js + + TOTAL: 30+ modelos + + ARCHIVO CRITICO — src/backend/media-favorites.js: + Gestiona favoritos de media. Kinds validos: + audios, bookmarks, calendars, chats, documents, + images, maps, pads, shops, torrents, videos + (Si falta un kind -> "Invalid favorites kind" -> 500 en esa ruta) -------------------------------------------------------------- -VISTAS (src/views/) — Hyperaxe SSR — 43 VISTAS TOTALES +VISTAS (src/views/) — Hyperaxe SSR — 51 VISTAS TOTALES -------------------------------------------------------------- Patron: const { div, h2, p } = require('../server/node_modules/hyperaxe'); exports.miVista = async (datos) => template('Titulo', section(...)) - LISTA COMPLETA DE VISTAS: + VISTAS CORE: activity_view.js, agenda_view.js, AI_view.js, audio_view.js, banking_views.js, blockchain_view.js, bookmark_view.js, cipher_view.js, courts_view.js, cv_view.js, document_view.js, @@ -69,48 +92,89 @@ VISTAS (src/views/) — Hyperaxe SSR — 43 VISTAS TOTALES trending_view.js, tribes_view.js, video_view.js, vote_view.js, wallet_view.js + VISTAS NUEVAS (upstream 0.7.4): + calendars_view.js, chats_view.js, games_view.js, logs_view.js + maps_view.js, pads_view.js, shops_view.js, torrents_view.js + VISTAS CON QR (modificadas): inhabitants_view.js -> QR del SSB ID en perfil y lista invites_view.js -> QR del pub invite code - tribes_view.js -> QR del tribe invite code - wallet_view.js -> (ya tenia QR de direccion ECOin) + tribes_view.js -> QR del tribe invite code (+ mapa, ancestro privado) + wallet_view.js -> QR de direccion ECOin blockchain_view.js -> renderInviteExtra con detalle de inviteLog --------------------------------------------------------------- -BLOCKCHAIN (SSB log como blockchain) --------------------------------------------------------------- - blockchain_model.js -> listBlockchain() - - Llama createLogStream() en todos los mensajes SSB - - Filtra por tipo: 'post', 'about', 'vote', 'tribe', - 'pub-invite', 'invites', etc. - - Cada mensaje SSB es un "bloque" con hash, key, sequence, content - - blockchain_view.js -> renderBlockchainView() - - Muestra bloques con colores por tipo - - Filtros: ALL, POST, VOTE, TRIBE, INVITES, etc. - - renderInviteExtra(): tabla de inviteLog (6 columnas) para tribes - y tabla de datos pub-invite (pubHost, pubKey, acceptedAt) - --------------------------------------------------------------- -FRONTEND (CSS/Assets) --------------------------------------------------------------- - styles/style.css -> CSS principal (estilos globales) - styles/mobile.css -> 480 lineas para movil (safe-area, touch, QR) - themes/OasisMobile.css -> tema dark gold (color solo, sin mobile) - themes/Dark-SNH.css, Matrix-SNH.css, Purple-SNH.css, Clear-SNH.css - translations/ -> i18n (es, en, ...) - -------------------------------------------------------------- SSB (Secure Scuttlebutt) -------------------------------------------------------------- Identidad: @.ed25519 + ID actual: @DCiP6BJlx5z56fYD0qd0c1x+YhmNKYOuWX+5DzRYtHw=.ed25519 + Data dir: ~/.ssb/ + gossip.json -> pubs conocidos (vacio en dev, se llena al aceptar invites) + conn.json -> estado de conexiones activas + secret -> clave privada ed25519 (NO TOCAR) + flume/ -> base de datos SSB (log.offset, contacts2.json) + ebt/ -> datos de replicacion por peer + Mensajes firmados, append-only, cadena de bloques real Replicacion via pubs (gossip.json en ~/.ssb/) - Pub invite format: host:port:@key.ed25519~invite_token + + FLUJO DE PUB INVITE: + 1. Usuario va a /invites y pega un codigo formato: + net:HOST:PORT~shs:PUBKEY=~invite:TOKEN= + 2. POST /settings/invite/accept (con Referer header) + 3. main_models.js::acceptInvite() llama ssb.invite.accept() + 4. Publica SSB msg { type:'pub-invite', pubHost, pubKey, acceptedAt } + 5. El pub queda en gossip.json y el nodo se conecta + + NOTA: gossip.json en dev esta vacio. Los pubs se añaden + aceptando invites desde la UI en /invites. -------------------------------------------------------------- -COMPARACION CON UPSTREAM PUBLICO (github.com/epsylon/oasis) +BLOCKCHAIN EXPLORER -------------------------------------------------------------- - LOCAL: 43 vistas, AI, blockchain, tribunales, banca, parlamento... - UPSTREAM: ~15 vistas basicas (feed, tribes, about, peers basico) - CONCLUSION: Local es version MAS AVANZADA. NO actualizar desde upstream. + RUTA CORRECTA: /blockexplorer (NO /blockchain — ese da 404) + blockchain_model.js -> listBlockchain() + - Filtra por tipo: post, about, vote, tribe, pub-invite, etc. + blockchain_view.js -> renderBlockchainView() + - renderInviteExtra(): tabla de inviteLog (tribes) y datos pub-invite + +-------------------------------------------------------------- +MAPAS OFFLINE +-------------------------------------------------------------- + src/maps/ + map_renderer.js -> renderizador de mapas + tiles/ -> 5461 PNG tiles zoom 0-8 (~42 MB) + NOTA: src/maps/maps/ era un duplicado accidental, eliminado. + Tiles de zoom 0-8 cubren el mundo entero a baja resolución. + +-------------------------------------------------------------- +JUEGOS +-------------------------------------------------------------- + src/games/ -> 16 juegos JS puro: + 8ball, arkanoid, artillery, asteroids, audiopendulum, + cocoland, cocoman, ecoinflow, flipflop, labyrinth, + neoninfiltrator, pingpong, rockpaperscissors, + spaceinvaders, tetris, tiktaktoe + +-------------------------------------------------------------- +FRONTEND (CSS/Assets) +-------------------------------------------------------------- + styles/style.css -> CSS principal ~5180 lineas (upstream + custom) + styles/mobile.css -> movil (safe-area, touch, QR, mode-buttons) + themes/OasisMobile.css -> tema dark gold + public/js/mobile-ui.js -> flechas scroll + expand en .mode-buttons + translations/ -> i18n es, en, de, fr, it, pt, eu + +-------------------------------------------------------------- +COMPARACION CON UPSTREAM (github.com/epsylon/oasis) +-------------------------------------------------------------- + UPSTREAM: v0.7.4 (referencia: /home/sito/COFRE/CODERS/ULTIMO_OASIS/oasis/) + LOCAL: v0.7.4 con modificaciones: + - QR codes en inhabitants, invites, tribes, wallet + - inviteLog trazabilidad en tribes + - SSB msg type:'pub-invite' al aceptar pub invite + - blockchain explorer con filtro 'invites' + - menu hamburger movil (CSS puro) + - mobile.css + mobile-ui.js para movil + - viewport-fit=cover para notch Android/iOS + - Economy + Media activados por defecto en config