UNPKG

khamba

Version:

A cli tool for sharing files through local network.

74 lines (73 loc) 2.58 kB
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(); }; }, []); };