JohnAllen
JohnAllen

Reputation: 7521

How to write Meteor.wrapAsync fs.readFile?

I need a function that emits individual lines from a file with newlines. Nothing hard.

But with node, it is hard, and with Meteor, there's an additional complication: you must use Meteor.wrapAsync. Surprisingly, there isn't an example of how to use wrapAsync in the docs, and I could only find a couple of examples online, none of which helped.

I have something like:

var readFileAsync = function (file, cb) {
  // From here to below comment works synchronously
  var instream = fs.createReadStream(file, function () {
    var outstream = new stream;
    outstream.readable = true;
    outstream.writable = true;
    var rl = readline.createInterface({
      input: instream,
      output: outstream,
      terminal: false
    });
    rl.on('line', function(line) {
      console.log(line);
      return line;
    });
  });
  // Reference to aforementioned comment
};

var readWatFile = Meteor.wrapAsync(readFileAsync);
  var line = readWatFile('/path/to/my/file');
  console.log(line);

I know this is wrong because it doesn't work, so how do I write this?

Upvotes: 0

Views: 505

Answers (1)

imslavko
imslavko

Reputation: 6676

There are two ways to go around it.

  • Load the whole file into memory and do whatever you want. To do that you can use the Private Assets API
  • Use node.js streams and stream the file line by line. You would have something like this.

Example code that you would need to tweak to your favorite streaming methods:

var Future = Npm.require('fibers/future');
var byline = Npm.require('byline');
var f = new Future;
// create stream in whatever way you like
var instream = fs.createReadStream(...);
var stream = byline.createStream(instream);

// run stream handling line-by-line events asynchronously
stream.on('data', Meteor.bindEnvironment(function (line) {
   if (line) console.log(line)
   else future.return();
}));

  // await on the future yielding to the other fibers and the line-by-line handling
  future.wait();

Upvotes: 1

Related Questions