agentOOjoe
agentOOjoe

Reputation: 85

Node.js - Can I store writeable streams as JSON in Redis?

I am still working on fully understanding streams in node.js. If I create a writable stream, would I be able able to store the stream object as JSON in Redis, and then access it later, and continue writing to it (after JSON.parse)?

example:

var fs = require( 'fs' );
var redis = require( 'redis' );

var streamName = fs.createWriteStream(upfilePath, streamopts);
streamName = JSON.stringify(streamName);

rclient.set('streamJSON', streamName);

.... 

var myNewdata = 'whatever';
rclient.get('streamJSON', function (err, streamJSON) {
   var recoveredStream = JSON.parse(streamJSON);

   recoveredStream.write(myNewdata, function (err, written, buffer) {
      //write successful??
   }
}

Upvotes: 3

Views: 1314

Answers (1)

fent
fent

Reputation: 18205

You can't store variable references on redis. You would only need to store the filename, then reopen the stream with the a flag which allows you to append data to it.

I thought this was pretty an interesting question and created this that allows you to save the state of a stream and then use it later. But I don't see the point if you can just use the a flag. Might be useful for ReadableStreams though.

var fs = require('fs');

exports.stringify = function(stream) {
  var obj = {
      path: stream.path
    , writable: stream.writable
    , fd: stream.fd
    , options: {
        encoding: stream.encoding
      , mode: stream.mode
    }
  };

  if (stream.writable) {
    obj.bytesWritten = stream.bytesWritten;

  } else {
    obj.options.bufferSize = stream.bufferSize;
    obj.bytesRead = stream.bytesRead;
  }

  return JSON.stringify(obj);
};

exports.parse = function(json, callback) {
  var obj = JSON.parse(json);
  var stream;

  if (obj.writable) {
    obj.options.flags = 'a';
    stream = fs.createWriteStream(obj.path, obj.options);
    stream.bytesWritten = obj.bytesWritten;


  } else {
    stream = fs.createReadStream(obj.path, obj.options);
    stream.bytesRead = obj.bytesRead;
  }

  // if stream was already opened, wait until it is
  if (obj.fd !== null) {
    stream.on('open', function() {
      callback(null, stream);
    });
  } else {
    process.nextTick(function() {
      callback(null, stream);
    });
  }

  return stream;
};

Upvotes: 3

Related Questions