const path = require('path');
const fs = require('fs');
const panic = require('panic-server');
const manager = require('panic-manager')();
const { stopAll } = require('./relay');
const routes = {
'/': __dirname + '/index.html',
'/panic.js': require.resolve('panic-client'),
};
const beamWasmDir = path.resolve(__dirname, '../../browser-test');
if (fs.existsSync(path.join(beamWasmDir, 'beam.js'))) {
routes['/beam.js'] = path.join(beamWasmDir, 'beam.js');
routes['/beam_bg.wasm'] = path.join(beamWasmDir, 'beam_bg.wasm');
}
let srvStarted = false;
function setupPanic(opts = {}) {
const numClients = opts.numClients || 2;
const panicPort = opts.panicPort || 8765;
const ip = 'localhost';
if (!srvStarted) {
const srv = panic.server();
srv.on('request', (req, res) => {
const filePath = routes[req.url];
if (filePath && !res.headersSent) {
fs.createReadStream(filePath).pipe(res);
}
});
srv.listen(panicPort, () => {
console.log(`[panic] server on :${panicPort}`);
});
srvStarted = true;
}
manager.start({
clients: Array.from({ length: numClients }, (_, i) => ({
type: 'node',
port: panicPort + i + 1,
})),
panic: `http://${ip}:${panicPort}`,
});
const clients = panic.clients;
const alice = clients.pluck(1);
const bob = clients.excluding(alice).pluck(1);
const rest = clients.excluding([alice, bob]);
const result = { clients, alice, bob, rest };
if (numClients >= 3) {
result.carol = rest.pluck(1);
}
if (numClients >= 4) {
result.dave = rest.excluding(result.carol).pluck(1);
}
return result;
}
function genMsgId(prefix = 'msg') {
return prefix + Math.random().toString(36).slice(2);
}
function teardownPanic() {
try { manager.stop(); } catch (e) { }
stopAll();
}
module.exports = { setupPanic, genMsgId, teardownPanic };