mirror of
https://github.com/bitsocialnet/5chan.git
synced 2026-08-03 07:41:04 +02:00
69 lines
2.7 KiB
JavaScript
69 lines
2.7 KiB
JavaScript
import tcpPortUsed from 'tcp-port-used';
|
|
import EnvPaths from 'env-paths';
|
|
import { randomBytes } from 'crypto';
|
|
import fs from 'fs-extra';
|
|
import PlebbitRpc from '@plebbit/plebbit-js/rpc';
|
|
import path from 'path';
|
|
import { fileURLToPath } from 'url';
|
|
import isDev from 'electron-is-dev';
|
|
const dirname = path.join(path.dirname(fileURLToPath(import.meta.url)));
|
|
const envPaths = EnvPaths('plebbit', { suffix: false });
|
|
|
|
// PLEB, always run plebbit rpc on this port so all clients can use it
|
|
const port = 9138;
|
|
const defaultPlebbitOptions = {
|
|
// find the user's OS data path
|
|
dataPath: !isDev ? envPaths.data : path.join(dirname, '..', '.plebbit'),
|
|
kuboRpcClientsOptions: [{ url: 'http://localhost:50019/api/v0' }],
|
|
httpRoutersOptions: ['https://routing.lol', 'https://peers.pleb.bot', 'https://peers.plebpubsub.xyz', 'https://peers.forumindex.com'],
|
|
};
|
|
|
|
// generate plebbit rpc auth key if doesn't exist
|
|
const plebbitRpcAuthKeyPath = path.join(defaultPlebbitOptions.dataPath, 'auth-key');
|
|
let plebbitRpcAuthKey;
|
|
try {
|
|
plebbitRpcAuthKey = fs.readFileSync(plebbitRpcAuthKeyPath, 'utf8');
|
|
} catch (e) {
|
|
plebbitRpcAuthKey = randomBytes(32).toString('base64').replace(/[/+=]/g, '').substring(0, 40);
|
|
fs.ensureFileSync(plebbitRpcAuthKeyPath);
|
|
fs.writeFileSync(plebbitRpcAuthKeyPath, plebbitRpcAuthKey);
|
|
}
|
|
|
|
const startPlebbitRpcAutoRestart = async () => {
|
|
let pendingStart = false;
|
|
const start = async () => {
|
|
if (pendingStart) {
|
|
return;
|
|
}
|
|
pendingStart = true;
|
|
try {
|
|
const started = await tcpPortUsed.check(port, '127.0.0.1');
|
|
if (!started) {
|
|
const plebbitWebSocketServer = await PlebbitRpc.PlebbitWsServer({ port, plebbitOptions: defaultPlebbitOptions, authKey: plebbitRpcAuthKey });
|
|
plebbitWebSocketServer.on('error', (e) => console.log('plebbit rpc error', e));
|
|
|
|
console.log(`plebbit rpc: listening on ws://localhost:${port} (local connections only)`);
|
|
console.log(`plebbit rpc: listening on ws://localhost:${port}/${plebbitRpcAuthKey} (secret auth key for remote connections)`);
|
|
plebbitWebSocketServer.ws.on('connection', (socket, request) => {
|
|
console.log('plebbit rpc: new connection');
|
|
// debug raw JSON RPC messages in console
|
|
if (isDev) {
|
|
socket.on('message', (message) => console.log(`plebbit rpc: ${message.toString()}`));
|
|
}
|
|
});
|
|
}
|
|
} catch (e) {
|
|
console.log('failed starting plebbit rpc server', e);
|
|
}
|
|
pendingStart = false;
|
|
};
|
|
|
|
// retry starting the plebbit rpc server every 1 second,
|
|
// in case it was started by another client that shut down and shut down the server with it
|
|
start();
|
|
setInterval(() => {
|
|
start();
|
|
}, 1000);
|
|
};
|
|
startPlebbitRpcAutoRestart();
|