UNPKG

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
"use strict"; 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); });