1 module.exports = FileWriter
3 var fs = require('graceful-fs')
4 var Writer = require('./writer.js')
5 var inherits = require('inherits')
8 inherits(FileWriter, Writer)
10 function FileWriter (props) {
12 if (!(self instanceof FileWriter)) {
13 throw new Error('FileWriter must be called as constructor.')
16 // should already be established as a File type
17 if (props.type !== 'File' || !props.File) {
18 throw new Error('Non-file type ' + props.type)
22 self._bytesWritten = 0
24 Writer.call(this, props)
27 FileWriter.prototype._create = function () {
29 if (self._stream) return
32 if (self.props.flags) so.flags = self.props.flags
33 so.mode = Writer.filemode
34 if (self._old && self._old.blksize) so.bufferSize = self._old.blksize
36 self._stream = fs.createWriteStream(self._path, so)
38 self._stream.on('open', function () {
39 // console.error("FW open", self._buffer, self._path)
41 self._buffer.forEach(function (c) {
42 if (c === EOF) self._stream.end()
43 else self._stream.write(c)
46 // give this a kick just in case it needs it.
50 self._stream.on('error', function (er) { self.emit('error', er) })
52 self._stream.on('drain', function () { self.emit('drain') })
54 self._stream.on('close', function () {
55 // console.error('\n\nFW Stream Close', self._path, self.size)
60 FileWriter.prototype.write = function (c) {
63 self._bytesWritten += c.length
66 if (!Buffer.isBuffer(c) && typeof c !== 'string') {
67 throw new Error('invalid write data')
73 var ret = self._stream.write(c)
74 // console.error('\t-- fw wrote, _stream says', ret, self._stream._queue.length)
76 // allow 2 buffered writes, because otherwise there's just too
77 // much stop and go bs.
78 if (ret === false && self._stream._queue) {
79 return self._stream._queue.length <= 2
85 FileWriter.prototype.end = function (c) {
91 self._buffer.push(EOF)
95 return self._stream.end()
98 FileWriter.prototype._finish = function () {
100 if (typeof self.size === 'number' && self._bytesWritten !== self.size) {
102 'Did not get expected byte count.\n' +
103 'expect: ' + self.size + '\n' +
104 'actual: ' + self._bytesWritten)
106 Writer.prototype._finish.call(self)