UNPKG

@runejs/filestore

Version:

Tools for managing the RuneJS filestore.

102 lines (101 loc) 3.27 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MusicStore = exports.MidiFile = void 0; const common_1 = require("@runejs/common"); const node_fs_1 = require("node:fs"); const filestore_1 = require("../filestore"); /** * A single MIDI file object. */ class MidiFile { fileData; constructor(fileData) { this.fileData = fileData; } /** * Writes this unpacked MIDI file to the disk under `./unpacked/midi/{midiFileName}.mid` */ async writeToDisk() { return new Promise((resolve, reject) => { try { const fileName = (0, filestore_1.getFileName)(this.fileData.nameHash).replace(/ /g, '_'); if (!(0, node_fs_1.existsSync)('./unpacked/midi')) { (0, node_fs_1.mkdirSync)('./unpacked/midi'); } const data = this.fileData.decompress(); (0, node_fs_1.writeFileSync)(`./unpacked/midi/${this.fileId}_${fileName}.mid`, Buffer.from(data)); resolve(); } catch (error) { reject(error); } }); } get fileId() { return this.fileData?.fileId || -1; } } exports.MidiFile = MidiFile; /** * Controls MIDI file storage. */ class MusicStore { fileStore; constructor(fileStore) { this.fileStore = fileStore; } /** * Writes all unpacked MIDI files to the disk under `./unpacked/midi/` */ async writeToDisk() { const files = this.decodeMusicStore(); for (const midi of files) { try { await midi.writeToDisk(); } catch (e) { common_1.logger.error(e); } } } /** * Decodes the specified midi file. * @param nameOrId The name or ID of the midi file. * @returns The decoded MidiFile object, or null if the file is not found. */ getMidi(nameOrId) { if (!nameOrId) { return null; } const midiArchiveIndex = this.fileStore.getIndex('music'); const fileData = midiArchiveIndex.getFile(nameOrId); return fileData ? new MidiFile(fileData) : null; } /** * Decodes all midi files within the filestore. * @returns The list of decoded MidiFile objects from the midi store. */ decodeMusicStore() { const midiArchiveIndex = this.fileStore.getIndex('music'); const fileCount = midiArchiveIndex.files.size; const midiFiles = new Array(fileCount); for (let midiId = 0; midiId < fileCount; midiId++) { try { const fileData = midiArchiveIndex.getFile(midiId); if (!fileData) { midiFiles[midiId] = null; common_1.logger.warn(`No file found for midi ID ${midiId}.`); continue; } midiFiles[midiId] = new MidiFile(fileData); } catch (e) { midiFiles[midiId] = null; common_1.logger.error(`Error parsing midi ID ${midiId}.`); common_1.logger.error(e); } } return midiFiles; } } exports.MusicStore = MusicStore;