Wednesday 26 April 2017

Electron - Invalid package on unzip

For around 3 weeks I've been working on an Electron app and finally decided to get around to adding update checking. For my research, the standard way to do this in Electron (using Squirrel) requires the user to physically install the application onto their computer. I would rather not do this, and keep everything as portable as possible. I then decided to try making my own update script by having the program download the update.zip, and extract it to overwrite the existing files. This works well, up until the very end. At the very end of the extraction, I receive a Invalid package error, and the actual app.asar file is missing, rendering the application useless.

I am using this to download and extract the updates:

function downloadFile(url, target, fileName, cb) { // Downloads
    var req = request({
        method: 'GET',
        uri: url
    });

    var out = fs.createWriteStream(target+'/'+fileName);
    req.pipe(out);

    req.on('end', function() {
        unzip(target+'/'+fileName, target, function() {
            if (cb) {
                cb();
            }
        });
    });
}
function unzip(file, target, cb) { // Unzips

    var out = fs.createReadStream(file);
    out.pipe(unzipper.Extract({ path: target })).on('finish', function () {
        dialog.showMessageBox({
            type: 'question',
            message: 'Finished extracting to `'+target+'`'
        });

        if (cb) {
            cb();
        }
    });
}

And call it with:

downloadFile('http://example.com/update.zip', path.join(__dirname, './'), 'update.zip', function() { // http://example.com/update.zip is not the real source
    app.relaunch();
    app.quit();
});

And I use the unzipper NPM package (https://www.npmjs.com/package/unzipper).

The code works perfectly for all other zips, but it fails when trying to extract a zip containing an Electron app.

Anything I'm doing wrong, or maybe a different package that properly supports extracting zips with .asar files?



via LordBingShipley

No comments:

Post a Comment