Search code examples
performancefile-uploaduploadnode.jslimit

How would I limit upload speed from the server in node.js?


How would I limit upload speed from the server in node.js?

Is this even an option?

Scenario: I'm writing some methods to allow users to automated-ly upload files to my server. I want to limit the upload speed to (for instance) 50kB/s (configurable of course).


Solution

  • I do not think you can force a client to stream at a predefined speed, however you can control the "average speed" of the entire process.

    var startTime  = Date.now(),
        totalBytes = ..., //NOTE: you need the client to give you the total amount of incoming bytes
        curBytes   = 0;
    
    stream.on('data', function(chunk) { //NOTE: chunk is expected to be a buffer, if string look for different ways to get bytes written
         curBytes += chunk.length;
         var offsetTime = calcReqDelay(targetUploadSpeed);
         if (offsetTime > 0) {
             stream.pause();
             setTimeout(offsetTime, stream.resume);
         }
    });
    
    function calcReqDelay(targetUploadSpeed) { //speed in bytes per second
        var timePassed = Date.now() - startTime;
        var targetBytes = targetUploadSpeed * timePassed / 1000;
        //calculate how long to wait (return minus in case we actually should be faster)
        return waitTime;
    }
    

    This is of course pseudo code, but you probably get the point. There may be another, and better, way which I do not know about. In such case, I hope someone else will point it out.

    Note that it is also not very precise, and you may want to have a different metric than the average speed.