-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.js
59 lines (54 loc) · 1.68 KB
/
server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// use to connect and write data to receiver
const net = require('net');
// use to resolve hostname from ip address
const dns = require('dns').promises;
// use for file reading/writing
const fs = require('fs').promises;
// use for obtaining internal IP
const os = require('os');
// port used across active fairdrop devices
const PORT = 7329;
// create a server
const server = net.createServer();
// listen for connection
server.on('connection', async (socket) => {
// retrieve device hostnames
let hostnames = await dns.reverse(socket.remoteAddress);
// print incoming connection
console.log(`Incoming connection:
Device name: ${hostnames[0]} | IPv4: ${socket.remoteAddress}`);
// pass socket to handler
handler(socket);
});
let totalBytes = Buffer.from([]);
const handler = async (socket) => {
// Received data
socket.on('data', (data) => {
// update the total bytes
totalBytes = Buffer.concat([totalBytes, Buffer.from(data)]);
});
// On end data tranmission
socket.on('end', async () => await saveFile(totalBytes));
}
const saveFile = async (bytes) => {
// grab the file object from bytes
let file = JSON.parse(bytes);
// convert bytes back into raw data
file.bytes = Buffer.from(file.bytes.data);
// write the file
await fs.writeFile(file.name, file.bytes);
// confirm
console.log(`${file.name} saved`);
}
// listen for errors
server.on('error', (err) => {
throw err;
});
// get default network interface
const { en0 } = os.networkInterfaces();
// get IPv4 address
const IPv4 = en0[1].address;
// open the server and listen
server.listen(PORT, IPv4, () => {
console.log(`Listening on port ${PORT}`)
});