JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 4654
  • Score
    100M100P100Q118227F
  • License MIT

extract archive files in browser, libarchive port in wasm

Package Exports

  • libarchive.js

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (libarchive.js) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

Libarchivejs

build status dependency status

Overview

Libarchivejs is a archive tool for browser which can extract various types of compression, it's port of libarchive to WebAssembly and javascript wrapper to make it easier to use, since it run's on WebAssembly performance should be comparable to native

How to use

Install with npm i libarchivejs and use it as ES module. library consists of two parts: ES module and webworker bundle, ES module part is your interface to talk to library, use it like any other module, webworker bundle lives in libarchivejs/dist folder so you need to make sure that it is available in your public folder since it will not get bundled if you're using bundler (it's all bundled up already) and specify correct path to Archive.init() method

import {Archive} from 'libarchivejs/main.js';

Archive.init({
    workerUrl: 'libarchivejs/dist/worker-bundle.js'
});

document.getElementById('file').addEventListener('change', async (e) => {
    const file = e.currentTarget.files[0];

    const archive = await Archive.open(file);
    let obj = await archive.extractFiles();
    
    console.log(obj);
});

// outputs
{
    ".gitignore": {File},
    "addon": {
        "addon.py": {File},
        "addon.xml": {File}
    },
    "README.md": {File}
}

More options

To get file listing without actually decompressing archive, use one of these methods

    await archive.getFilesObject();
    // outputs
    {
        ".gitignore": null,
        "addon": {
            "addon.py": null,
            "addon.xml": null
        },
        "README.md": null
    }

    await archive.getFilesArray();
    // outputs
    [
        {file: ".gitignore", path: ""},
        {file: "addon.py",   path: "addon/"},
        {file: "addon.xml",  path: "addon/"},
        {file: "README.md",  path: ""}
    ]

if this methods get called after archive.extractFiles(); they will contain actual files as well

decompression might take long for bigger files, to track each file as it gets extracted archive.extractFiles accepts callback

    archive.extractFiles((entry) => { // { file: {File}, path: {String} }
        console.log(entry);
    });

How it works

Libarchivejs is port of popular libarchive C library to WASM. since WASM runs in current thread library uses WebWorkers for heavy lifting, ES Module (Archive class) is just a client for WebWorker, it's tiny and doesn't take up much space. only when you actually open archive file web worker will be spawn and WASM module will be downloaded, each Archive.open call corresponds to each WebWorker. after calling extractFiles worker will be terminated to free up memory, client will still work with cached data