const { gzip } = require('./util/gzip') // I don't like using a loader in this way but I // guess this is punishment for putting off // putting AsarHandler in it's own project // and finishing FakeBuffer const { AsarHandler: Asar, Buffer } = le._apps.abnt function toArrayBuffer(buffer) { let ab = new ArrayBuffer(buffer.length), view = new Uint8Array(ab) for (let i = 0; i < buffer.length; ++i) { view[i] = buffer[i] } return ab } const textDecoder = new TextDecoder('utf-8') class ModPackage { static async unpack(buffer, direct = false) { let asar = new Asar(buffer), manifestString = textDecoder.decode( asar.get('manifest.json') ), files = [ ...asar.contents ] const decompress = path => new Promise((resolve, reject) => { // gzip(asar.get(path), (error, data) => { // console.log('GZIP: ', path, data) // if(error) // reject(error) // else // resolve([ path, toArrayBuffer(data) ]) // }) resolve([ path, asar.get(path) ]) }) files.splice(files.indexOf('manifest.json'), 1) files = files.map(decompress) files = await Promise.all(files) return direct ? { files, manifestString } : new this(new Map(files), manifestString) } constructor(files, manifestString) { this.manifest = JSON.parse(manifestString) this.files = files this.cache = new Map() } get(path) { if(this.cache.has(path)) return this.cache.get(path) let data = this.files.get(path), ext = $fs.utils.getExt(path), file = new Blob([ data ], { type: le._get.ext.mime[ext] }) this.cache.set(path, file) return file } getURL(path) { let file = this.get(path), url = URL.createObjectURL(file) return url } } module.exports = ModPackage