docs: rewrite 04_ARQUITECTURA with v0.7.4 state and verified routes
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
d3fc961649
commit
5717204716
1 changed files with 125 additions and 61 deletions
|
|
@ -1,5 +1,6 @@
|
||||||
===============================================================
|
===============================================================
|
||||||
ARQUITECTURA — OASIS MOBILE (Node.js)
|
ARQUITECTURA — OASIS MOBILE (Node.js)
|
||||||
|
Actualizado: 2026-05-02 | Version: 0.7.4
|
||||||
===============================================================
|
===============================================================
|
||||||
|
|
||||||
ENTRY POINT:
|
ENTRY POINT:
|
||||||
|
|
@ -10,52 +11,74 @@ ENTRY POINT:
|
||||||
--------------------------------------------------------------
|
--------------------------------------------------------------
|
||||||
BACKEND (Koa.js)
|
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
|
- Router con 100+ rutas GET/POST
|
||||||
- Carga todos los modelos al inicio
|
- 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)
|
- Patron: ctx.body = await vistaView(datos)
|
||||||
|
|
||||||
RUTAS CLAVE:
|
RUTAS VERIFICADAS (HTTP 200 confirmado 2026-05-02):
|
||||||
GET / -> home / feed
|
GET / -> home (302 redirect a /activity)
|
||||||
GET /inhabitants -> lista de usuarios
|
GET /activity -> feed de actividad
|
||||||
GET /author/:id -> perfil de usuario
|
GET /inhabitants -> lista de usuarios
|
||||||
GET /tribes -> lista de tribes
|
GET /tribes -> list de tribes
|
||||||
POST /tribes/generate-invite -> genera invite code de tribe (con inviteLog)
|
GET /invites -> invites/pubs SSB
|
||||||
POST /tribes/join-code -> unirse a tribe con codigo (actualiza inviteLog)
|
GET /peers -> peers conectados
|
||||||
GET /invites -> pagina de invites/pubs SSB
|
GET /blockexplorer -> blockchain explorer SSB (NO es /blockchain)
|
||||||
POST /settings/invite/accept -> acepta pub invite + publica SSB msg
|
GET /settings -> configuracion
|
||||||
GET /wallet -> wallet ECOin
|
GET /modules -> activar/desactivar modulos
|
||||||
GET /wallet/receive -> recibir (tiene QR de direccion)
|
GET /search -> busqueda
|
||||||
GET /blockchain -> blockchain explorer (SSB log)
|
GET /banking -> banca ECOin
|
||||||
GET /AI -> integracion IA
|
GET /market -> mercado
|
||||||
GET /parliament -> gobernanza
|
GET /chats -> chats directos
|
||||||
GET /market -> mercado
|
GET /pads -> pads colaborativos
|
||||||
GET /courts -> tribunales
|
GET /games -> 16 juegos en JS
|
||||||
GET /banking -> banca ECOin
|
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/)
|
MODELOS (src/models/)
|
||||||
--------------------------------------------------------------
|
--------------------------------------------------------------
|
||||||
about_model.js -> perfiles de usuario
|
MODELOS CORE:
|
||||||
tribes_model.js -> tribes + inviteLog trazabilidad completa
|
about_model.js -> perfiles de usuario
|
||||||
- generateInvite(tribeId) -> registra en inviteLog[] con generatedBy
|
main_models.js -> SSB core: peers, acceptInvite, rebuild
|
||||||
- joinByInvite(code, userId) -> actualiza inviteLog (status, usedBy, usedAt)
|
blockchain_model.js -> listBlockchain() con filtros por tipo
|
||||||
- getTribeById() / listAll() -> exponen inviteLog
|
tribes_model.js -> tribes + inviteLog trazabilidad completa
|
||||||
main_models.js -> acceptInvite() -> publica SSB msg type:'pub-invite'
|
- generateInvite(tribeId) -> registra en inviteLog[] con generatedBy
|
||||||
blockchain_model.js -> listBlockchain() con filtro 'invites'
|
- joinByInvite(code, userId) -> actualiza inviteLog (status, usedBy, usedAt)
|
||||||
courts_model.js, banking_model.js, parliament_model.js, ...
|
|
||||||
(30+ modelos en total)
|
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:
|
Patron:
|
||||||
const { div, h2, p } = require('../server/node_modules/hyperaxe');
|
const { div, h2, p } = require('../server/node_modules/hyperaxe');
|
||||||
exports.miVista = async (datos) => template('Titulo', section(...))
|
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,
|
activity_view.js, agenda_view.js, AI_view.js, audio_view.js,
|
||||||
banking_views.js, blockchain_view.js, bookmark_view.js,
|
banking_views.js, blockchain_view.js, bookmark_view.js,
|
||||||
cipher_view.js, courts_view.js, cv_view.js, document_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,
|
trending_view.js, tribes_view.js, video_view.js, vote_view.js,
|
||||||
wallet_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):
|
VISTAS CON QR (modificadas):
|
||||||
inhabitants_view.js -> QR del SSB ID en perfil y lista
|
inhabitants_view.js -> QR del SSB ID en perfil y lista
|
||||||
invites_view.js -> QR del pub invite code
|
invites_view.js -> QR del pub invite code
|
||||||
tribes_view.js -> QR del tribe invite code
|
tribes_view.js -> QR del tribe invite code (+ mapa, ancestro privado)
|
||||||
wallet_view.js -> (ya tenia QR de direccion ECOin)
|
wallet_view.js -> QR de direccion ECOin
|
||||||
blockchain_view.js -> renderInviteExtra con detalle de inviteLog
|
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)
|
SSB (Secure Scuttlebutt)
|
||||||
--------------------------------------------------------------
|
--------------------------------------------------------------
|
||||||
Identidad: @<base64_ed25519_pubkey>.ed25519
|
Identidad: @<base64_ed25519_pubkey>.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
|
Mensajes firmados, append-only, cadena de bloques real
|
||||||
Replicacion via pubs (gossip.json en ~/.ssb/)
|
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...
|
RUTA CORRECTA: /blockexplorer (NO /blockchain — ese da 404)
|
||||||
UPSTREAM: ~15 vistas basicas (feed, tribes, about, peers basico)
|
blockchain_model.js -> listBlockchain()
|
||||||
CONCLUSION: Local es version MAS AVANZADA. NO actualizar desde upstream.
|
- 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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue