andrade-soulseek-downloader
Version:
Simple, safe Soulseek download library with built-in rate limiting to prevent bans
107 lines • 3.9 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.Listen = void 0;
const events_1 = require("events");
const net = __importStar(require("net"));
const messages_1 = require("./messages");
const debug = (msg) => {
if (process.env.DEBUG?.includes('slsk:listen')) {
console.log(`[slsk:listen] ${msg}`);
}
};
class Listen extends events_1.EventEmitter {
port;
server;
constructor(port) {
super();
this.port = port;
this.server = net.createServer((c) => {
let user;
const msgs = new messages_1.Messages();
c.on('data', chunk => {
msgs.write(chunk);
});
c.on('error', err => {
debug(`listen connection error ${err.code}`);
});
msgs.on('message', (msg) => {
const size = msg.int32();
if (size < 4)
return;
if (!user) {
const code = msg.int8();
switch (code) {
case 0: {
const token = msg.int32();
debug(`recv Pierce Firewall, token: ${token}`);
break;
}
case 1: {
user = msg.str();
const type = msg.str();
const token = msg.int32();
debug(`peerInit ${user}, type ${type}, token ${token}`);
this.emit('new-peer', {
socket: c,
peer: { user, type, token }
});
break;
}
default: {
debug('unattended case.');
}
}
}
});
c.on('end', () => {
debug('client disconnected');
});
});
this.server.on('error', err => {
debug(`Listen Server Error ${err}`);
});
this.server.listen(this.port, '0.0.0.0', () => {
debug(`Listen peer connections on port ${this.port}`);
});
}
destroy() {
if (this.server) {
this.server.close(() => debug('Listen peer connections server closed'));
}
}
}
exports.Listen = Listen;
//# sourceMappingURL=listen.js.map