import { inflate } from 'pako'; import { Assets, Texture } from 'pixi.js'; import { ArrayBufferToBase64 } from './ArrayBufferToBase64'; import { BinaryReader } from './BinaryReader'; export class NitroBundle { private static TEXT_DECODER: TextDecoder = new TextDecoder('utf-8'); private _jsonFile: Object = null; private _texture: Texture = null; public static async from(buffer: ArrayBuffer): Promise { const bundle = new NitroBundle(); await bundle.parse(buffer); return bundle; } public async parse(arrayBuffer: ArrayBuffer): Promise { const binaryReader = new BinaryReader(arrayBuffer); let fileCount = binaryReader.readShort(); while(fileCount > 0) { const fileNameLength = binaryReader.readShort(); const fileName = binaryReader.readBytes(fileNameLength).toString(); const fileLength = binaryReader.readInt(); const buffer = binaryReader.readBytes(fileLength); const inflatedBuffer = inflate(buffer.toArrayBuffer()); if(fileName.endsWith('.json')) { this._jsonFile = JSON.parse(NitroBundle.TEXT_DECODER.decode(inflatedBuffer)); } else { this._texture = await Assets.load(`data:image/png;base64,${ ArrayBufferToBase64(inflatedBuffer) }`); } fileCount--; } } public get jsonFile(): Object { return this._jsonFile; } public get texture(): Texture { return this._texture; } }