const tcpPortUsed = require('tcp-port-used'); const { PlebbitWsServer } = require('@plebbit/plebbit-js/rpc'); const path = require('path'); const envPaths = require('env-paths').default('plebbit', { suffix: false }); const { randomBytes } = require('crypto'); const fs = require('fs-extra'); let isDev = true; try { isDev = require('electron-is-dev'); } catch (e) {} // 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'), ipfsHttpClientsOptions: ['http://localhost:5001/api/v0'], // TODO: having to define pubsubHttpClientsOptions and ipfsHttpClientsOptions is a bug with plebbit-js pubsubHttpClientsOptions: ['http://localhost:5001/api/v0'], }; // 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); } let pendingStart = false; const start = async () => { if (pendingStart) { return; } pendingStart = true; try { const started = await tcpPortUsed.check(port, '127.0.0.1'); if (started) { return; } const plebbitWebSocketServer = await PlebbitWsServer({ port, plebbitOptions: defaultPlebbitOptions, authKey: plebbitRpcAuthKey }); 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);