net-files
Version:
Share files in browser in p2p manner. The file is not stored on the server.
67 lines (66 loc) • 2.22 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const express_1 = __importDefault(require("express"));
const listening_on_1 = require("listening-on");
const socket_io_1 = __importDefault(require("socket.io"));
const http_1 = __importDefault(require("http"));
const dotenv_1 = require("dotenv");
const path_1 = require("path");
(0, dotenv_1.config)();
let port = +process.env.PORT || 8100;
for (let arg of process.argv.slice(2)) {
port = +arg || port;
}
let app = (0, express_1.default)();
let server = http_1.default.createServer(app);
let io = new socket_io_1.default.Server(server);
// slug -> name -> FileMeta
let rooms = {};
io.on('connection', socket => {
socket.on('join', slug => {
socket.join('slug:' + slug);
let room = rooms[slug];
if (room) {
for (let name in room) {
let fileMeta = room[name];
socket.emit('has', { slug, name, ...fileMeta });
}
}
});
socket.on('leave', slug => {
socket.leave('slug:' + slug);
});
socket.on('has', data => {
let { slug, name, ...fileMeta } = data;
let room = (rooms[slug] ||= {});
room[name] = fileMeta;
io.to('slug:' + slug).emit('has', data);
});
socket.on('remove', ({ slug, name }) => {
let room = rooms[slug];
if (room) {
delete room[name];
}
});
function forwardData(event) {
socket.on(event, async (data) => {
let sockets = await io.in('slug:' + data.slug).fetchSockets();
for (let peerSocket of sockets) {
if (peerSocket.id == socket.id)
continue;
peerSocket.emit(event, data);
}
});
}
forwardData('want');
forwardData('content');
});
app.use(express_1.default.static((0, path_1.join)(__dirname, '..', 'public')));
app.use(express_1.default.json());
app.use(express_1.default.urlencoded({ extended: false }));
server.listen(port, () => {
(0, listening_on_1.print)(port);
});