khamba
Version:
A cli tool for sharing files through local network.
74 lines (73 loc) • 2.58 kB
JavaScript
import dgram from 'dgram';
import { useEffect } from 'react';
import useBroadcast from '../functions/broadcast.js';
import { addDiscoveredPeer } from '../stores/peersStore.js';
import chalk from 'chalk';
import { log, logError } from '../functions/log.js';
export const useUdpServer = (MY_ID, NAME, BROADCAST_ADDR, MY_IP, UDP_PORT, HTTP_PORT) => {
const { broadcast } = useBroadcast();
useEffect(() => {
const server = dgram.createSocket({
type: 'udp4',
reuseAddr: true,
});
server.bind({
port: UDP_PORT,
address: '0.0.0.0',
exclusive: false,
});
const msg = {
method: 'SELF',
name: NAME,
id: MY_ID,
ip: MY_IP,
httpPort: HTTP_PORT,
isBroadcast: true,
};
const initialBroadcast = () => {
broadcast(server, BROADCAST_ADDR, UDP_PORT, JSON.stringify(msg));
};
server.on('listening', function () {
const address = server.address();
log(`Listening on ${address.address}:${address.port}`);
server.setBroadcast(true);
initialBroadcast();
});
server.on('message', (receivedMsg, rinfo) => {
const data = JSON.parse(receivedMsg?.toString());
if (data.id == MY_ID) {
return;
}
// log('DATA:', data);
// ! DEBUGGING...
if (data?.isBroadcast) {
log(`${chalk.bgYellow('<-- Broadcasted From:')} ${chalk.underline(data.name)}: ${data.id}`);
}
else {
log(`${chalk.bgCyan('<-- Received From:')} ${chalk.underline(data.name)}: ${data.id}`);
}
if (data?.method == 'SELF') {
const isAlreadyAdded = !addDiscoveredPeer({
id: data.id,
ip: rinfo.address,
name: data.name,
httpPort: data?.httpPort,
});
if (!isAlreadyAdded || data?.isBroadcast) {
const message = JSON.stringify({
...msg,
isBroadcast: false,
});
server.send(message, rinfo.port, rinfo.address);
}
}
});
server.on('error', err => {
logError(`server error:\n${err.stack}`);
server.close();
});
return () => {
server.close();
};
}, []);
};