metalaureate
metalaureate

Reputation: 7732

Node.js stream.on('end'... does not make file readable

I try to catch the completion of writing the canvas stream thusly:

    var out = fs.createWriteStream(out_fs);
    var stream = canvas.createPNGStream({
        bufsize: 2048
    });
    stream.on('end', function () {
      // can we use out_fs now? why not?
    });
    stream.pipe(out);

But when I try to load out_fs in sub function

Error: Image given has not completed loading

at this line:

            fs.readFile(out_fs, function (err, data) {
                    if (err) throw err;
                    var img = new Canvas.Image; // Create a new Image
                    img.src = data;
                    ctx2.drawImage(img, 0, 50, img.width, img.height); <--

http://nodejs.org/api/stream.html#stream_event_end

But I don't see any other way to continue with the control flow after the stream is written. If I let the entire parent function return, the file then seems readable. I've tried wrapping my child functions in setImmediate(), but that only seems to work intermittently.

What is the definitive way to catch the final usable end result of writing the stream?

The node-canvas documentation claims that the end event signals the final writing of the file: https://www.npmjs.com/package/canvas#canvaspngstream

But this generates the error above if you immediately try to use it.

`finish' does not seem to be implemented at all.

Upvotes: 0

Views: 2068

Answers (2)

aarosil
aarosil

Reputation: 4898

Since you have piped stream to out, out will be close()'d automatically on stream's end event (this is part of what gets setup automatically when you .pipe() a stream). So, to know when file is finished being written, listen to the close event of out stream.

You saw intermittent results because the stream end event is the same event that will be used by out writable stream to finalize the file.

Upvotes: 1

diversemix
diversemix

Reputation: 569

I would put this in a comment (but can't):

You need to close your WriteStream called 'out' - use the event aarosil suggests and do out.close()

Upvotes: 1

Related Questions