fr32-sha2-256-trunc254-padded-binary-tree-multihash
Rust implementation of V2 Piece Multihash per FIP0069 compiled to WASM and wrapped in JS package.
Usage
import Hasher from "fr32-sha2-256-trunc254-padded-binary-tree-multihash"
export const digestStream = async (source: AsyncIterable<Uint8Array>) => {
const hasher = Hasher.create()
for await (const chunk of source) {
hasher.write(chunk)
}
const digest = new Uint8Array(hasher.multihashByteLength())
hasher.digestInto(
digest,
0,
true
)
hasher.free()
return digest
}
Please note that multihash size is not fixed, so if you need to slab allocate
it is best to assume MAX_SIZE
for each digest.
import Hasher from "fr32-sha2-256-trunc254-padded-binary-tree-multihash"
export const concatDigest = async (left: AsyncIterable<Uint8Array>, right: AsyncIterable<Uint8Array>) => {
const buffer = new Uint8Array(2 * Hasher.MAX_SIZE)
const hasher = Hasher.create()
for await (const chunk of left) {
hasher.write(chunk)
}
const offset = hasher.digestInto(
buffer,
0,
true
)
hasher.reset()
for await (const chunk of right) {
hasher.write(chunk)
}
const end = hasher.digestInto(
buffer,
offset,
true
)
hasher.free()
return digest.subarray(0, end)
}
Environments that require wasm import
Some environments require loading wasm byte code with import (e.g. Cloudflare workers). All other paths may be disallowed by embedder. You can rely on the wasm-import
export to load bytecode with the import.
import Hasher from "fr32-sha2-256-trunc254-padded-binary-tree-multihash/wasm-import"
export const digestStream = async (source: AsyncIterable<Uint8Array>) => {
const hasher = Hasher.create()
for await (const chunk of source) {
hasher.write(chunk)
}
const digest = new Uint8Array(hasher.multihashByteLength())
hasher.digestInto(
digest,
0,
true
)
hasher.free()
return digest
}
Environments that do not support top level await
The main module in this library uses a top-level await to load wasm
. In environments that
do not support top-level await (ie, legacy browser environments and many bundlers that build
for them) you can use the async
module like this:
import { digest } from "fr32-sha2-256-trunc254-padded-binary-tree-multihash/async"
export const createDigest = async (bytes: Uint8Array) => {
return await digest(bytes)
}
or even combine the async
usage with wasm-import
as follows:
import { digest } from "fr32-sha2-256-trunc254-padded-binary-tree-multihash/async-wasm-import"
export const createDigest = async (bytes: Uint8Array) => {
return await digest(bytes)
}