https://github.com/2003scape/rsc-archiver
📦 compress and decompress runescape classic cache archives
https://github.com/2003scape/rsc-archiver
archiver buffer bzip2 cache hash jag jagex rsc runescape runescape-client
Last synced: 7 months ago
JSON representation
📦 compress and decompress runescape classic cache archives
- Host: GitHub
- URL: https://github.com/2003scape/rsc-archiver
- Owner: 2003scape
- License: agpl-3.0
- Created: 2019-11-16T16:59:24.000Z (almost 6 years ago)
- Default Branch: master
- Last Pushed: 2022-11-14T18:08:20.000Z (almost 3 years ago)
- Last Synced: 2025-02-23T14:07:18.234Z (7 months ago)
- Topics: archiver, buffer, bzip2, cache, hash, jag, jagex, rsc, runescape, runescape-client
- Language: JavaScript
- Homepage:
- Size: 32.2 KB
- Stars: 6
- Watchers: 3
- Forks: 4
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: COPYING
Awesome Lists containing this project
README
# rsc-archiver
compress and decompress runescape classic .jag/.mem cache files. these files
contain a proprietary header describing the size of the archive, and of
each individual entry (file). filenames are stored with a hash so it's
impossible to recover the originals without bruteforcing (unless they're under
~5 characters).this module works in the browser and node.
## install
$ npm install @2003scape/rsc-archiver # -g for CLI program
## cli usage
```
rsc-archiverCommands:
rsc-archiver x extract a file from an archive
[aliases: extract]
rsc-archiver a add files to an archive [aliases: add]
rsc-archiver d remove files from an archive
[aliases: delete]
rsc-archiver l list hashes and file sizes in an archive
[aliases: list]
rsc-archiver h return the integer hash of a filename stri
ng [aliases: hash]Options:
--help Show help [boolean]
--version Show version number [boolean]Examples:
rsc-archiver l ./cache/config85.jag list the hashes in config85.jag
rsc-archiver a ./cache/jagex.jag logo.tg add logo.tga to jagex.jag
a
```## example
```javascript
import fs from 'fs/promises';
import { JagArchive } from './src/index.js';const archive = new JagArchive();
await archive.init();
archive.readArchive(await fs.readFile('./cache/sounds1.mem'));console.log(`cache has ${archive.entries.size} files`);
// get death.pcm from the archive and write it to disk
await fs.writeFile('death.pcm', archive.getEntry('death.pcm'));// create a new archive and add a text file to it
archive.entries.clear();
archive.putEntry('test.txt', Buffer.from('test string'));
await fs.writeFile('./cache/test.jag', archive.toArchive(true));// read the new archive and retrive the file from it
archive.readArchive(await fs.readFile('./cache/test.jag'))console.log(`cache has ${archive.entries.size} files`);
console.log(Buffer.from(archive.getEntry('test.txt')).toString());
```## api
### hashFilename(filename)
convert `filename` to integer hash used in archives.### archive = new JagArchive()
create a new jag (de)compressor instance.### archive.entries
Map of hashes -> decompressed file buffers.### async archive.init()
initialize the bzip wasm.### archive.readArchive(buffer)
decompress buffer and populate entries with each file within.### archive.hasEntry(name)
check if archive contains entry based on hash or filename.### archive.getEntry(name)
return entry based on name or hash.### archive.putEntry(name, buffer)
add a file to the archive buffer.### archive.removeEntry(name)
remove entry based on name or hash.### archive.toArchive(individualCompress=true)
compress entries to a jagex archive. if `individualCompress` is true, bzip each
file separately. otherwise, concatinate all of the files and then bzip
that result instead.## license
Copyright 2022 2003Scape TeamThis program is free software: you can redistribute it and/or modify it under
the terms of the GNU Affero General Public License as published by the
Free Software Foundation, either version 3 of the License, or (at your option)
any later version.This program is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.You should have received a copy of the GNU Affero General Public License along
with this program. If not, see http://www.gnu.org/licenses/.