Files
impost/packages/lib/README.md
Zoe cfab3d0b8f Initial commit
Once again a weird place to commit, I have already done a lot of work, but I am just bad at using git, okay.
2025-11-17 16:12:26 +00:00

1.5 KiB

@impost/lib

This package contains the types and WASM code for the impost. It is useful for building other packages that want to use the WASM code, a client, or a server.

Usage

import {
  validate_challenge,
  generate_target_number_challenge,
} from "@impost/lib/validator";
import {
  init_solver,
  get_wasm_module,
  solve_target_number_challenge,
} from "@impost/lib/solver";
import { type Challenge, ChallengeStrategy } from "@impost/lib";

const challenge = await generate_target_number_challenge(
  // timeout in ms
  {
    // impost automatically recognizes this parameter, its also recommended to
    // add a timestamp to prevent replay or pre-computation attacks
    expires_at: Date.now() + 3600,
  }
  // max number
  1_000
);

if (challenge === null) {
  throw new Error("Failed to generate challenge");
}

let solver = await init_solver(
  {
    __get_solution: () => Atomics.load(atomic_solution!, 0),
    __set_solution: (value: number) =>
      Atomics.store(atomic_solution!, 0, value),
    __cmpxchg_solution: (expected: number, replacement: number) =>
      Atomics.compareExchange(atomic_solution!, 0, expected, replacement),
    __fetch_add_nonce: (value: number) => Atomics.add(atomic_nonce!, 0, value),
  },
  await get_wasm_module()
);

const solution = await solve_target_number_challenge(solver, {
  salt: challenge.salt,
  target: challenge.target,
});

const is_valid = await validate_challenge(challenge, {
  challenge: challenge.target,
  nonce: solution,
});

if (is_valid) {
  console.log("Challenge solved!", solution);
}