# integrity-js

Client-side verification library for the [Integrity](https://github.com/eqtylab/integrity) framework, compiled from Rust to WebAssembly and published as an npm package (`@eqtylab/integrity-js`).

Used in the `VerifyLabel` component of the `lineage-explorer` package to verify lineage graph nodes entirely in the browser.

## Verification Functions

### `verify_statement(statement, contexts?) -> bool`

Verifies a JSON-LD statement by recomputing its content identifier and comparing it to the embedded `@id`. The process:

1. Parses the JSON-LD statement and extracts the `@id`
2. Converts the statement to N-Quads and canonicalizes using RDFC 1.0
3. Computes a BLAKE3 CID over the canonicalized output
4. Returns `true` if the computed CID matches the `@id`

Optional `contexts` parameter allows passing additional JSON-LD context documents as `{ uri: contextObject }` pairs (useful when contexts can't be fetched at runtime due to CORS).

### `verify_vc(vc, statement_id) -> bool`

Verifies a W3C Verifiable Credential:

1. Checks that the credential subject ID matches the given `statement_id`
2. Verifies the VC proof using the DID Key method
3. Returns `true` if both checks pass

## Development

### Using Nix (recommended)

The project includes a Nix flake that provides all development dependencies:

```sh
nix develop
```

### Manual Setup

Install the following dependencies:

- [Rust](https://rustup.rs/) (cargo, rustc, rustfmt, clippy)
- [wasm-pack](https://rustwasm.github.io/wasm-pack/)
- [wasm-bindgen-cli](https://rustwasm.github.io/wasm-bindgen/)
- [just](https://github.com/casey/just)
- [present-cli](https://github.com/nicholasgasior/present-cli)
- [Node.js](https://nodejs.org/)
- [lld](https://lld.llvm.org/)
- pkg-config and OpenSSL

## Just Commands

The project uses [Just](https://github.com/casey/just) for common development tasks.

```present just --list
Available recipes:
    build         # Build the WASM package for npm
    ci            # Run all CI checks (formatting, readme, lints, tests)
    clean         # Remove build artifacts
    fix           # Auto-fix clippy warnings where possible
    fmt           # Format code with rustfmt
    fmt-check     # Check code formatting without modifying files
    lint          # Run clippy lints
    lint-docs     # Check that all public items have documentation
    readme-check  # Verify README.md is up to date
    readme-update # Regenerate README.md in place
    test *args    # Run wasm-bindgen integration tests in a headless browser
```

## Publishing

To publish a new version to npm, create a new release on GitHub with a semantic version tag (e.g., `v1.0.0`). The package will be automatically built and published to npm via GitHub Actions.
