index.js 1.69 KB

/*

  db.collection.find().stream().pipe(Stringify()).pipe(res)

*/

var Transform = require('readable-stream/transform')
var stringify = require('json-stringify-safe')
var util = require('util')

util.inherits(Stringify, Transform)

module.exports = Stringify

function Stringify(options) {
  if (!(this instanceof Stringify))
    return new Stringify(options || {})
  if (options && options.replacer) {
    this.replacer = options.replacer;
  }
  if (options && options.space !== undefined) {
    this.space = options.space;
  }
  Transform.call(this, options || {})
  this._writableState.objectMode = true

  // Array Deliminator and Stringifier defaults
  var opener = options && options.opener ? options.opener : '[\n'
  var seperator = options && options.seperator ? options.seperator : '\n,\n'
  var closer = options && options.closer ? options.closer : '\n]\n'
  var stringifier = options && options.stringifier ? options.stringifier : stringify

  // Array Deliminators and Stringifier
  this.opener = new Buffer(opener, 'utf8')
  this.seperator = new Buffer(seperator, 'utf8')
  this.closer = new Buffer(closer, 'utf8')
  this.stringifier = stringifier
}

// Flags
Stringify.prototype.started = false

// JSON.stringify options
Stringify.prototype.replacer = null
Stringify.prototype.space = 0

Stringify.prototype._transform = function (doc, enc, cb) {
  if (this.started) {
    this.push(this.seperator)
  } else {
    this.push(this.opener)
    this.started = true
  }

  doc = this.stringifier(doc, this.replacer, this.space)

  this.push(new Buffer(doc, 'utf8'))
  cb()
}

Stringify.prototype._flush = function (cb) {
  if (!this.started) this.push(this.opener)
  this.push(this.closer)
  this.push(null)
  cb()
}