scratch-parser/lib/unpack.js
Karishma Chadha 103db490a3 build(unpack): Swap out 3rd party zip library
Swapping out adm-zip dependency with jszip for use with the browser.
2018-02-25 21:19:51 -05:00

42 lines
1.4 KiB
JavaScript

var JSZip = require('jszip');
/**
* Transforms buffer into a UTF-8 string. If input is encoded in ZIP format,
* the input will be extracted and decoded.
*
* @param {Buffer} Input
*
* @return {String}
*/
module.exports = function (input, callback) {
// Validate input type
var typeError = 'Input must be a Buffer.';
if (!Buffer.isBuffer(input)) return callback(typeError);
// Determine format
// We don't use the file suffix as this is unreliable and mine-type
// information is unavailable from Scratch's project CDN. Instead, we look
// at the first few bytes from the provided buffer (byte signature).
// https://en.wikipedia.org/wiki/List_of_file_signatures
var signature = input.slice(0, 3).join(' ');
var isLegacy = false;
var isZip = false;
if (signature.indexOf('83 99 114') === 0) isLegacy = true;
if (signature.indexOf('80 75') === 0) isZip = true;
// If not legacy or zip, convert buffer to UTF-8 string and return
if (!isZip && !isLegacy) return callback(null, input.toString('utf-8'));
// Return error if legacy encoding detected
if (isLegacy) return callback('Parser only supports Scratch 2.X');
// Handle zip
// @todo Handle error
JSZip.loadAsync(input).then(function (zip) {
zip.file('project.json').async('string')
.then(function (project) {
callback(null, project);
});
});
};