Oasis 0.9.5 con Karvan para escritorio
Rama de desarrollo experimental sobre el Oasis de epsylon, sin afiliacion con el proyecto original. Base: 0.9.5. Trae el modulo Karvan —salas efimeras en memoria con autodestruccion por TTL, chat que funciona sin JavaScript y llamadas de audio y video sobre WebRTC— con el enlace en el menu lateral por el mismo patron que el resto de modulos: renderKarvanLink calcado de renderPollsLink, entrada en modules_view y en la lista de /modules. Los estilos del modulo van en su propia hoja, styles/karvan.css, siguiendo el patron de highlight.css: asi se ve igual con cualquier tema, sin depender del tema movil. Sin servidores ICE de terceros: no hay STUN de fabrica, porque un STUN aprende la IP publica y el momento de cada llamada. Solo candidatos host salvo que se configure un TURN propio en oasis-config.json, con credenciales efimeras por el mecanismo REST de coturn. El codigo propio vive separado —views/fork/, backend/fork_routes.js, models/karvan_model.js y translations/fork/— de modo que sobre los ficheros de upstream solo hay enganches de una linea y cada version nueva se integra sin arrastrar nada. Respecto al arbol de Android: fuera el wrapper y main.js, que es su arranque; el tema vuelve a Dark-SNH y se restauran los modulos que en movil se recortan por peso. Verificado arrancando sin OASIS_MOBILE: nueve rutas OK, menu lateral de upstream con 27 grupos y el enlace de Karvan, cero rastro de la interfaz movil (ni hexagonos, ni topbar, ni barra inferior), y una sala creada y servida.
This commit is contained in:
commit
ddd2787b73
286 changed files with 157145 additions and 0 deletions
79
scripts/patch-node-modules.js
Normal file
79
scripts/patch-node-modules.js
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
const log = (msg) => console.log(`[OASIS] [PATCH] ${msg}`);
|
||||
|
||||
// === Patch ssb-ref ===
|
||||
const ssbRefPath = path.resolve(__dirname, '../src/server/node_modules/ssb-ref/index.js');
|
||||
if (fs.existsSync(ssbRefPath)) {
|
||||
const data = fs.readFileSync(ssbRefPath, 'utf8');
|
||||
const alreadyClean = /exports\.parseAddress\s*=\s*parseAddress/.test(data);
|
||||
if (!alreadyClean) {
|
||||
const patched = data.replace(
|
||||
/exports\.parseAddress\s*=\s*deprecate\(\s*['"][^'"]*['"]\s*,\s*parseAddress\s*\)/,
|
||||
'exports.parseAddress = parseAddress'
|
||||
);
|
||||
if (patched !== data) {
|
||||
fs.writeFileSync(ssbRefPath, patched);
|
||||
log('Patched ssb-ref to remove deprecated usage of parseAddress');
|
||||
} else {
|
||||
log('ssb-ref patch skipped: unexpected parseAddress export format');
|
||||
}
|
||||
}
|
||||
} else {
|
||||
log('ssb-ref patch skipped: file not found at ' + ssbRefPath);
|
||||
}
|
||||
|
||||
// === Patch ssb-blobs ===
|
||||
const ssbBlobsPath = path.resolve(__dirname, '../src/server/node_modules/ssb-blobs/inject.js');
|
||||
if (fs.existsSync(ssbBlobsPath)) {
|
||||
let data = fs.readFileSync(ssbBlobsPath, 'utf8');
|
||||
|
||||
const marker = 'want: function (id, cb)';
|
||||
const startIndex = data.indexOf(marker);
|
||||
if (startIndex !== -1) {
|
||||
const endIndex = data.indexOf('},', startIndex);
|
||||
if (endIndex !== -1) {
|
||||
const before = data.slice(0, startIndex);
|
||||
const after = data.slice(endIndex + 2);
|
||||
|
||||
const replacement = `
|
||||
want: function (id, cb) {
|
||||
id = toBlobId(id);
|
||||
if (!isBlobId(id)) return cb(new Error('invalid id:' + id));
|
||||
|
||||
if (blobStore.isEmptyHash(id)) return cb(null, true);
|
||||
|
||||
if (wantCallbacks[id]) {
|
||||
if (!Array.isArray(wantCallbacks[id])) wantCallbacks[id] = [];
|
||||
wantCallbacks[id].push(cb);
|
||||
} else {
|
||||
wantCallbacks[id] = [cb];
|
||||
blobStore.size(id, function (err, size) {
|
||||
if (err) return cb(err);
|
||||
if (size != null) {
|
||||
while (wantCallbacks[id].length) {
|
||||
const fn = wantCallbacks[id].shift();
|
||||
if (typeof fn === 'function') fn(null, true);
|
||||
}
|
||||
delete wantCallbacks[id];
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
const peerId = findPeerWithBlob(id);
|
||||
if (peerId) get(peerId, id);
|
||||
|
||||
if (wantCallbacks[id]) registerWant(id);
|
||||
},`;
|
||||
|
||||
const finalData = before + replacement + after;
|
||||
fs.writeFileSync(ssbBlobsPath, finalData);
|
||||
log('Patched ssb-blobs to fix wantCallbacks handling');
|
||||
} else {
|
||||
log('ssb-blobs patch skipped: end of want function not found');
|
||||
}
|
||||
} else {
|
||||
log('ssb-blobs patch skipped: want function not found');
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue