Margin offline RAR engine

Source: node-unrar-js 2.0.2
https://github.com/YuJianrong/node-unrar.js
https://registry.npmjs.org/node-unrar-js/-/node-unrar-js-2.0.2.tgz
Upstream build uses the official UnRAR 6.1.7 source.
WASM SHA-256: c7d79f869196e3c79c053ba74a8f629116de8293a94f60cc851bbcd7977d0c2b

Licenses: NODE-UNRAR-LICENSE.txt (JavaScript wrapper, MIT) and UNRAR-LICENSE.txt
(official UnRAR engine). Only decompression is used.

Local changes to ESM JavaScript:
- Explicit .js import extensions for direct browser/Node module loading.
- Removed unavailable source-map references.
- Replaced Emscripten createNamedFunction and craftInvokerFunction code-generation
  glue with ordinary closures. This removes Function-constructor evaluation and
  retains the existing strict content security policy; only wasm-unsafe-eval is
  needed for the WebAssembly engine. The WASM bytes are unchanged.

Rebuild the classic worker from readable modules:
  python3 scripts/build-rar-worker.py
Run from margin-reader. No dependency install or network access is required.
The resulting dist/vendor/unrar-worker.js is loaded as a Blob worker, which makes
RAR extraction work from the iOS margin:// custom scheme without worker fetches.

Runtime safeguards live in dist/rar-engine.js and dist/rar-reader.js: bounded
archive/entry sizes, path validation, bounded output writes, timeouts and worker
termination on cancellation. Per-job workers retain the compressed input plus
one extracted file; extracted buffers are released after each transfer.
