var unzip = require('./unzip'); /** * If input a buffer, transforms buffer into a UTF-8 string. * If input is encoded in zip format, the input will be extracted and decoded. * If input is a string, passes that string along to the given callback. * @param {Buffer | string} input Project data * @param {boolean} isSprite Whether the input should be treated as * a sprite (true) or a whole project (false) * @param {Function} callback Error or stringified project data * @return {void} */ module.exports = function (input, isSprite, callback) { if (typeof input === 'string') { // Pass string to callback return callback(null, [input, null]); } // Validate input type var typeError = 'Input must be a Buffer or a string.'; if (!Buffer.isBuffer(input)) { try { input = new Buffer(input); } catch (e) { 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'), null]); } // Return error if legacy encoding detected if (isLegacy) return callback('Parser only supports Scratch 2.X and above'); unzip(input, isSprite, callback); };