universal-archive

Self-contained archive extraction node for n8n using bundled 7-Zip WebAssembly

Package Information

Released: 2 mo ago
Downloads: 0 weekly / 0 monthly
Latest Version: 0.1.2

Available Nodes

Documentation generating…

Documentation

n8n-nodes-universal-archive

Universal Archive is a self-contained n8n Community Node that extracts files
from common archive formats. It runs the archive engine in a worker so archive
processing does not block the node's main JavaScript event loop.

Self-contained distribution

  • No 7-Zip, WinRAR, or other system executable is required.
  • No runtime download is performed.
  • No environment variable is required.
  • The JavaScript/WebAssembly runtime and its licenses are included in the npm
    package.

The package contains the MIT-licensed node code, the bundled 7z-wasm
JavaScript/WASM runtime, the upstream LGPL notice, and the unRAR restriction
notice. Review LICENSE.md and
THIRD_PARTY_NOTICES.md before redistribution.

Installation

This package is for self-hosted n8n. In n8n, open Settings > Community
Nodes
, choose Install, enter n8n-nodes-universal-archive, acknowledge
the community-node warning, and complete the installation. Restart n8n if the
instance asks you to do so. The node then appears as Universal Archive in the
node picker.

Community Nodes installation requires the package to be published to npm. For
pre-publication testing, install the generated local tarball in the n8n user
folder's nodes package directory and restart that disposable n8n instance.

Parameters

Parameter Default Meaning
Operation Extract Extract the regular files in one archive layer.
Input Binary Field file Binary property on the incoming item that holds the archive. You may instead supply an expression that resolves to a binary object from another node, e.g. {{ $('Get file').item.binary.file }}, when intermediate nodes have dropped the binary.
Password Empty Password for an encrypted archive; expressions are supported.
Output Binary Field data Binary property created for each extracted file.
Max Files 0 Maximum number of extracted files.
Max Single File MB 0 Maximum size of one extracted file.
Max Total Size MB 0 Maximum combined extracted size.

For every resource setting, 0 means unlimited. Set finite limits for
untrusted input. With unlimited decompression, a large or highly compressed
archive can exhaust the n8n worker's memory or other resources before the node
can return a structured error.

Input and output

The node expects an n8n item with an archive in the configured binary field.
For example, with the default file field:

{
  "json": {
    "source": "upload",
    "archivePassword": "secret"
  },
  "binary": {
    "file": {
      "fileName": "documents.zip",
      "mimeType": "application/zip",
      "data": "<binary data managed by n8n>"
    }
  }
}

Use an expression instead of hard-coding a password when it is supplied by
the workflow, for example:

{{ $json.archivePassword }}

or from a specifically named upstream node:

{{ $('Archive Secrets').item.json.password }}

The expression is evaluated separately for each input item. An empty password
is valid for an unencrypted archive.

Each extracted regular file becomes one output item. The input JSON is
preserved, archive and entry metadata are added, and the file is placed in the
configured output binary field:

{
  "json": {
    "source": "upload",
    "archivePassword": "secret",
    "archive": {
      "fileName": "documents.zip",
      "format": "zip",
      "encrypted": true
    },
    "entry": {
      "path": "reports/summary.txt",
      "fileName": "summary.txt",
      "extension": "txt",
      "size": 128
    }
  },
  "binary": {
    "data": {
      "fileName": "summary.txt",
      "mimeType": "text/plain",
      "data": "<binary data managed by n8n>"
    }
  }
}

Directory entries do not produce output items. When Continue On Fail is
enabled, a failed input produces one item whose JSON contains
error: { code, message } instead of extracted binary data.

Tested formats

Support claims are limited to the compatibility matrix exercised by the
package's integration tests:

Format Tested variants
ZIP Store, Deflate, AES-128, AES-256 (method 99), mixed UTF-8 and legacy Chinese filenames
7z Plain, encrypted with encrypted headers
RAR RAR4 plain, RAR5 plain, RAR5 encrypted
TAR Plain TAR
TAR.GZ GZIP containing a TAR archive
GZIP Single compressed stream
BZIP2 Single compressed stream
XZ Single compressed stream

Recognition is based on archive content rather than the input filename
extension; the matrix also verifies these cases with a .bin filename.

Distribution verification used n8n 2.32.6, Node.js 24.14.1, and
7z-wasm 1.2.0. The verified n8n-nodes-universal-archive-0.1.0.tgz
SHA256 is
A8EBF389209D187CCAB50D58F70BEC23E0FCF7DEA3AFEE35A4B0FC7A3AFDBAF6.

Stable error codes

Code Meaning
INPUT_BINARY_MISSING The configured input binary field is absent.
ARCHIVE_FORMAT_UNSUPPORTED The bytes do not identify a supported archive, or the runtime cannot handle the format.
ARCHIVE_PASSWORD_REQUIRED The archive is encrypted and no password was supplied.
ARCHIVE_PASSWORD_INVALID The supplied password cannot decrypt the archive.
ARCHIVE_CORRUPT The archive is damaged or extraction output does not match its listing.
ARCHIVE_PATH_UNSAFE An entry has an absolute, traversal, duplicate, symbolic-link, hard-link, or otherwise unsafe path/type.
ARCHIVE_LIMIT_EXCEEDED A configured file-count, single-file-size, or total-size limit was exceeded.
ARCHIVE_ENGINE_FAILED The bundled archive engine failed unexpectedly.

Without Continue On Fail, the code is exposed as the n8n node error
description. With Continue On Fail, it is returned in json.error.code.

Limitations and safety behavior

  • Split and multi-volume archives are not supported. Supply one complete
    archive as one binary item.
  • Symbolic links, hard links, unsafe paths, duplicate normalized paths, and
    unsafe extracted file types are rejected rather than emitted.
  • Extraction is non-recursive. One node execution extracts one archive layer.
    For example, extracting bundle.tar.gz emits bundle.tar; add another
    Universal Archive node if the workflow should extract the TAR layer.
  • ZIP filenames use the UTF-8 flag or Info-ZIP Unicode Path metadata when
    available. For legacy entries without Unicode metadata, standard CP437 is
    preserved and GB18030/GBK names with a strong Chinese signal are recovered
    from the central directory. When 7-Zip's listing and extracted filesystem
    spell such a path differently, files are correlated by validated size and
    CRC rather than by filename alone.
  • Files are materialized in memory by the JS/WASM runtime and then returned as
    n8n binary data. Configure finite limits and worker resources accordingly.
  • Password diagnostics are redacted before unexpected engine failures are
    exposed, but workflows should still avoid placing secrets in ordinary JSON
    unless that handling is intentional.

Development

npm install
npm test
npm run build
npm run lint

Create and inspect a local release artifact without publishing it:

npm pack --dry-run --json
npm pack

Running npm publish is a separate, explicitly authorized release action.

Discussion