Add the /ws/p2p presence and signalling hub and the holders endpoint
This commit is contained in:
@@ -52,6 +52,7 @@ import { admitFile } from './p2p-admit.js';
|
||||
import { P2P } from './p2p-config.js';
|
||||
import * as p2pDb from './p2p-db.js';
|
||||
import { registerP2pRoutes } from './p2p-routes.js';
|
||||
import { createP2pHub, holdersPayload } from './p2p-hub.js';
|
||||
import { sha256Range } from './hash.js';
|
||||
import * as innertube from './innertube.js';
|
||||
import QRCode from 'qrcode';
|
||||
@@ -1884,7 +1885,9 @@ const party = createPartyHub();
|
||||
|
||||
// Bun allows ONE websocket handler per server: party sockets are tagged
|
||||
// (ws.data.hub === 'party'), everything else belongs to the remote relay.
|
||||
const pickHub = (ws) => (ws.data && ws.data.hub === 'party' ? party.websocket : remote.websocket);
|
||||
// …and P2P sockets are tagged ws.data.hub === 'p2p' (p2p-hub.js).
|
||||
const pickHub = (ws) => (ws.data && ws.data.hub === 'party' ? party.websocket
|
||||
: ws.data && ws.data.hub === 'p2p' ? p2pHub.websocket : remote.websocket);
|
||||
const websocketHandler = {
|
||||
maxPayloadLength: 256 * 1024,
|
||||
idleTimeout: 120,
|
||||
@@ -1962,6 +1965,21 @@ async function fileForCid(cid) {
|
||||
return (await f.exists()) ? { path, size: f.size } : null;
|
||||
}
|
||||
const p2p = registerP2pRoutes(app, { cfg: P2P, p2pDb, fileForCid, sha256Range });
|
||||
const p2pHub = createP2pHub({ getDevice: p2pDb.getDevice, enabled: () => P2P.enabled });
|
||||
|
||||
// GET /api/p2p/holders?v=<videoId>|cid=<sha256> — who holds a copy. Rows are
|
||||
// persistent; `stale` flags a holder not re-verified for P2P_STALE_DAYS.
|
||||
app.get('/api/p2p/holders', p2p.gate, async (c) => {
|
||||
const v = (c.req.query('v') || '').trim();
|
||||
const cid = (c.req.query('cid') || '').trim().toLowerCase();
|
||||
const hasCid = /^[0-9a-f]{64}$/.test(cid);
|
||||
if (!hasCid && !/^[A-Za-z0-9_-]{6,64}$/.test(v)) return c.json({ ok: false, error: 'missing v or cid' }, 400);
|
||||
const payload = await holdersPayload({
|
||||
videoId: v, cid: hasCid ? cid : null, p2pDb, isOnline: p2pHub.isOnline,
|
||||
staleDays: P2P.staleDays, serverHas: fileForCid,
|
||||
});
|
||||
return c.json(payload, 200, { 'Cache-Control': 'no-store' });
|
||||
});
|
||||
|
||||
// ============================================================================
|
||||
// GET /sw.js — serve the service worker with BUILD_TAG injected
|
||||
@@ -2081,6 +2099,7 @@ async function main() {
|
||||
const path = new URL(req.url).pathname;
|
||||
if (path === '/ws/remote') return remote.upgrade(req, server, clientIpOf(req, server));
|
||||
if (path === '/ws/party') return party.upgrade(req, server, clientIpOf(req, server));
|
||||
if (path === '/ws/p2p') return p2pHub.upgrade(req, server);
|
||||
return app.fetch(req, server);
|
||||
},
|
||||
websocket: websocketHandler,
|
||||
|
||||
Reference in New Issue
Block a user