74 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
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 |