I found some code that seems to fit my needs.
With the code below, I can detect both the progress of a user's download from the server-side, and fire an event once the file transfer completes.
var http = require("http");
var fs = require("fs");
var filename = "./large-file";
var serv = http.createServer(function (req, res) {
  var sent = 0;
  var lastChunkSize = 0;
  var stat = fs.statSync(filename);
  res.setHeader('Content-disposition', 'attachment; filename=large-file.iso');
  res.setHeader('Accept-Ranges', 'bytes');
  res.setHeader('Keep-Alive', 'timeout=5, max=100');
  res.writeHeader(200, {"Content-Length": stat.size});
  var fReadStream = fs.createReadStream(filename, { highWaterMark: 128 * 1024 });
  fReadStream.on('data', function (chunk) {
    if(!res.write(chunk)){
      fReadStream.pause();
      lastChunkSize = chunk.length;
      console.log('Sent', sent, 'of', stat.size);
    }
 });
 fReadStream.on('end', function () {
   console.log('Transfer complete.');
   res.end();
 });
 res.on("drain", function () {
   sent += lastChunkSize;
   fReadStream.resume();
 });
});
serv.listen(3001);