throttle-server.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. var ThrottleGroup = require("stream-throttle").ThrottleGroup;
  2. module.exports = throttle;
  3. /**
  4. *
  5. */
  6. function throttle (opts, listenHost) {
  7. var options = {
  8. local_host: listenHost,
  9. remote_host: listenHost,
  10. upstream: 10*1024,
  11. downstream: opts.speed.speed * 1024,
  12. keepalive: false
  13. };
  14. var serverOpts = {
  15. allowHalfOpen: true,
  16. rejectUnauthorized: false
  17. };
  18. var module = "net";
  19. var method = "createConnection";
  20. if (opts.key) {
  21. module = "tls";
  22. method = "connect";
  23. serverOpts.key = opts.key;
  24. serverOpts.cert = opts.cert;
  25. }
  26. return require(module).createServer(serverOpts, function (local) {
  27. var remote = require(module)[method]({
  28. host: opts.target.hostname,
  29. port: opts.target.port,
  30. allowHalfOpen: true,
  31. rejectUnauthorized: false
  32. });
  33. var upThrottle = new ThrottleGroup({ rate: options.upstream });
  34. var downThrottle = new ThrottleGroup({ rate: options.downstream });
  35. var localThrottle = upThrottle.throttle();
  36. var remoteThrottle = downThrottle.throttle();
  37. setTimeout(function () {
  38. local
  39. .pipe(localThrottle)
  40. .pipe(remote);
  41. }, opts.speed.latency);
  42. setTimeout(function () {
  43. remote
  44. .pipe(remoteThrottle)
  45. .pipe(local);
  46. }, opts.speed.latency);
  47. local.on("error", function() {
  48. remote.destroy();
  49. local.destroy();
  50. });
  51. remote.on("error", function() {
  52. local.destroy();
  53. remote.destroy();
  54. });
  55. });
  56. }