Add comprehensive installation and setup documentation

- Add GETTING_STARTED.md with quick start guide and development modes
- Add INSTALL.sh automated installation script
- Add INSTALLATION_CHECKLIST.md, INSTALLATION_SUCCESS.md, and INSTALLATION_SUMMARY.md
- Add QUICK_REFERENCE.md for common commands
- Add SETUP_GUIDE.md with detailed setup instructions
- Update README.md with improved project overview
- Add did-wallet app dependencies and node_modules
This commit is contained in:
Dorian
2026-01-27 17:18:21 +00:00
parent a81f655133
commit 0d073fa89e
22658 changed files with 4494151 additions and 6 deletions

View File

@@ -0,0 +1,4 @@
This project is dual licensed under MIT and Apache-2.0.
MIT: https://www.opensource.org/licenses/mit
Apache-2.0: https://www.apache.org/licenses/license-2.0

View File

@@ -0,0 +1,70 @@
# @multiformats/murmur3 <!-- omit in toc -->
[![multiformats.io](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://multiformats.io)
[![codecov](https://img.shields.io/codecov/c/github/multiformats/js-murmur3.svg?style=flat-square)](https://codecov.io/gh/multiformats/js-murmur3)
[![CI](https://img.shields.io/github/workflow/status/multiformats/js-murmur3/test%20&%20maybe%20release/master?style=flat-square)](https://github.com/multiformats/js-murmur3/actions/workflows/js-test-and-release.yml)
> Multiformats Murmur3 implementations
## Table of contents <!-- omit in toc -->
- [Install](#install)
- [Usage](#usage)
- [License](#license)
- [Contribute](#contribute)
## Install
```console
$ npm i @multiformats/murmur3
```
`MultihashHashers`s are exported from this library, they produce `MultihashDigest`s. Details about these can be found in the [multiformats multihash interface definitions](https://github.com/multiformats/js-multiformats/blob/master/src/hashes/interface.ts).
```js
import * as Block from 'multiformats/block'
import * as codec from '@ipld/dag-cbor'
import { murmur3128 as hasher } from '@multiformats/murmur3'
async function run () {
const value = { hello: 'world' }
const block = await Block.encode({ value, hasher, codec })
console.log(block.cid)
// -> CID(bafyseebn7ksk6khsn4an2lzmae6wm4qk)
}
run().catch(console.error)
```
## Usage
The `@multiformats/murmur3` package exports `murmur332` and `murmur3128` `MultihashHasher`s. The Multicodecs [table](https://github.com/multiformats/multicodec/blob/master/table.csv) defines these multihashes.
The `murmur3-32`, multicodec code `0x23`, may be imported as:
```js
import { murmur332 } from '@multiformats/murmur3'
```
The `murmur3-128`, multicodec code `0x22`, may be imported as:
```js
import { murmur3128 } from '@multiformats/murmur3'
```
The `murmur3-x64-64` (which is first 64-bits of `murmur3-128` used in UnixFS directory sharding), multicodec code `0x22`, may be imported as:
```js
import { murmur364 } from '@multiformats/murmur3'
```
## License
Licensed under either of
- Apache 2.0, ([LICENSE-APACHE](LICENSE-APACHE) / <http://www.apache.org/licenses/LICENSE-2.0>)
- MIT ([LICENSE-MIT](LICENSE-MIT) / <http://opensource.org/licenses/MIT>)
## Contribute
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,4 @@
export const murmur332: import("multiformats/hashes/hasher").Hasher<"murmur3-32", 35>;
export const murmur3128: import("multiformats/hashes/hasher").Hasher<"murmur3-128", 34>;
export const murmur364: import("multiformats/hashes/hasher").Hasher<"murmur3-x64-64", 34>;
//# sourceMappingURL=index.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.js"],"names":[],"mappings":"AAgBA,sFAKE;AAEF,wFAKE;AAGF,0FAKE"}

View File

@@ -0,0 +1,29 @@
/**
* Generate murmurhash3 x64 128-bit hash
*
* @param {Uint8Array} key - original data
* @param {number} [seed] - seed value (defaults to 0)
* @returns {Uint8Array} the hash value as 16 bytes
*/
export function murmurHash3_x64_128(key: Uint8Array, seed?: number): Uint8Array;
/**
* Generate murmurhash3 x86 128-bit hash
*
* @param {Uint8Array} key - original data
* @param {number} [seed] - seed value (defaults to 0)
* @returns {Uint8Array} the hash value as 16 bytes
*/
export function murmurHash3_x86_128(key: Uint8Array, seed?: number): Uint8Array;
/**
* Generate murmurhash3 x86 32-bit hash
*
* @param {Uint8Array} key - original data
* @param {number} [seed] - seed value (defaults to 0)
* @returns {number} the hash value as a number
*/
export function murmurHash3_x86_32(key: Uint8Array, seed?: number): number;
export type u64 = {
lo: number;
hi: number;
};
//# sourceMappingURL=murmur.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"murmur.d.ts","sourceRoot":"","sources":["../../../src/vendor/murmur.js"],"names":[],"mappings":"AAqLA;;;;;;GAMG;AACH,yCAJW,UAAU,SACV,MAAM,GACJ,UAAU,CAqGtB;AACD;;;;;;GAMG;AACH,yCAJW,UAAU,SACV,MAAM,GACJ,UAAU,CAiItB;AACD;;;;;;GAMG;AACH,wCAJW,UAAU,SACV,MAAM,GACJ,MAAM,CAoClB;kBAvcY;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAC"}

View File

@@ -0,0 +1,4 @@
This project is dual licensed under MIT and Apache-2.0.
MIT: https://www.opensource.org/licenses/mit
Apache-2.0: https://www.apache.org/licenses/license-2.0

View File

@@ -0,0 +1,251 @@
# multiformats
[![multiformats.io](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://multiformats.io)
[![codecov](https://img.shields.io/codecov/c/github/multiformats/js-multiformats.svg?style=flat-square)](https://codecov.io/gh/multiformats/js-multiformats)
[![CI](https://img.shields.io/github/actions/workflow/status/multiformats/js-multiformats/js-test-and-release.yml?branch=master\&style=flat-square)](https://github.com/multiformats/js-multiformats/actions/workflows/js-test-and-release.yml?query=branch%3Amaster)
> Interface for multihash, multicodec, multibase and CID
# About
<!--
!IMPORTANT!
Everything in this README between "# About" and "# Install" is automatically
generated and will be overwritten the next time the doc generator is run.
To make changes to this section, please update the @packageDocumentation section
of src/index.js or src/index.ts
To experiment with formatting, please run "npm run docs" from the root of this
repo and examine the changes made.
-->
This library defines common interfaces and low level building blocks for various interrelated multiformat technologies (multicodec, multihash, multibase, and CID). They can be used to implement custom base encoders / decoders / codecs, codec encoders /decoders and multihash hashers that comply to the interface that layers above assume.
This library provides implementations for most basics and many others can be found in linked repositories.
```TypeScript
import { CID } from 'multiformats/cid'
import * as json from 'multiformats/codecs/json'
import { sha256 } from 'multiformats/hashes/sha2'
const bytes = json.encode({ hello: 'world' })
const hash = await sha256.digest(bytes)
const cid = CID.create(1, json.code, hash)
//> CID(bagaaierasords4njcts6vs7qvdjfcvgnume4hqohf65zsfguprqphs3icwea)
```
## Creating Blocks
```TypeScript
import * as Block from 'multiformats/block'
import * as codec from '@ipld/dag-cbor'
import { sha256 as hasher } from 'multiformats/hashes/sha2'
const value = { hello: 'world' }
// encode a block
let block = await Block.encode({ value, codec, hasher })
block.value // { hello: 'world' }
block.bytes // Uint8Array
block.cid // CID() w/ sha2-256 hash address and dag-cbor codec
// you can also decode blocks from their binary state
block = await Block.decode({ bytes: block.bytes, codec, hasher })
// if you have the cid you can also verify the hash on decode
block = await Block.create({ bytes: block.bytes, cid: block.cid, codec, hasher })
```
## Multibase Encoders / Decoders / Codecs
CIDs can be serialized to string representation using multibase encoders that implement [`MultibaseEncoder`](https://github.com/multiformats/js-multiformats/blob/master/src/bases/interface.ts) interface. This library provides quite a few implementations that can be imported:
```TypeScript
import { base64 } from "multiformats/bases/base64"
cid.toString(base64.encoder)
//> 'mAYAEEiCTojlxqRTl6svwqNJRVM2jCcPBxy+7mRTUfGDzy2gViA'
```
Parsing CID string serialized CIDs requires multibase decoder that implements [`MultibaseDecoder`](https://github.com/multiformats/js-multiformats/blob/master/src/bases/interface.ts) interface. This library provides a decoder for every encoder it provides:
```TypeScript
CID.parse('mAYAEEiCTojlxqRTl6svwqNJRVM2jCcPBxy+7mRTUfGDzy2gViA', base64.decoder)
//> CID(bagaaierasords4njcts6vs7qvdjfcvgnume4hqohf65zsfguprqphs3icwea)
```
Dual of multibase encoder & decoder is defined as multibase codec and it exposes
them as `encoder` and `decoder` properties. For added convenience codecs also
implement `MultibaseEncoder` and `MultibaseDecoder` interfaces so they could be
used as either or both:
```TypeScript
cid.toString(base64)
CID.parse(cid.toString(base64), base64)
```
**Note:** CID implementation comes bundled with `base32` and `base58btc`
multibase codecs so that CIDs can be base serialized to (version specific)
default base encoding and parsed without having to supply base encoders/decoders:
```TypeScript
const v1 = CID.parse('bagaaierasords4njcts6vs7qvdjfcvgnume4hqohf65zsfguprqphs3icwea')
v1.toString()
//> 'bagaaierasords4njcts6vs7qvdjfcvgnume4hqohf65zsfguprqphs3icwea'
const v0 = CID.parse('QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n')
v0.toString()
//> 'QmdfTbBqBPQ7VNxZEYEj14VmRuZBkqFbiwReogJgS1zR1n'
v0.toV1().toString()
//> 'bafybeihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku'
```
## Multicodec Encoders / Decoders / Codecs
This library defines [`BlockEncoder`, `BlockDecoder` and `BlockCodec` interfaces](https://github.com/multiformats/js-multiformats/blob/master/src/codecs/interface.ts).
Codec implementations should conform to the `BlockCodec` interface which implements both `BlockEncoder` and `BlockDecoder`.
Here is an example implementation of JSON `BlockCodec`.
```TypeScript
export const { name, code, encode, decode } = {
name: 'json',
code: 0x0200,
encode: json => new TextEncoder().encode(JSON.stringify(json)),
decode: bytes => JSON.parse(new TextDecoder().decode(bytes))
}
```
## Multihash Hashers
This library defines [`MultihashHasher` and `MultihashDigest` interfaces](https://github.com/multiformats/js-multiformats/blob/master/src/hashes/interface.ts) and convinient function for implementing them:
```TypeScript
import * as hasher from 'multiformats/hashes/hasher'
const sha256 = hasher.from({
// As per multiformats table
// https://github.com/multiformats/multicodec/blob/master/table.csv#L9
name: 'sha2-256',
code: 0x12,
encode: (input) => new Uint8Array(crypto.createHash('sha256').update(input).digest())
})
const hash = await sha256.digest(json.encode({ hello: 'world' }))
CID.create(1, json.code, hash)
//> CID(bagaaierasords4njcts6vs7qvdjfcvgnume4hqohf65zsfguprqphs3icwea)
```
## Traversal
This library contains higher-order functions for traversing graphs of data easily.
`walk()` walks through the links in each block of a DAG calling a user-supplied loader function for each one, in depth-first order with no duplicate block visits. The loader should return a `Block` object and can be used to inspect and collect block ordering for a full DAG walk. The loader should `throw` on error, and return `null` if a block should be skipped by `walk()`.
```TypeScript
import { walk } from 'multiformats/traversal'
import * as Block from 'multiformats/block'
import * as codec from 'multiformats/codecs/json'
import { sha256 as hasher } from 'multiformats/hashes/sha2'
// build a DAG (a single block for this simple example)
const value = { hello: 'world' }
const block = await Block.encode({ value, codec, hasher })
const { cid } = block
console.log(cid)
//> CID(bagaaierasords4njcts6vs7qvdjfcvgnume4hqohf65zsfguprqphs3icwea)
// create a loader function that also collects CIDs of blocks in
// their traversal order
const load = (cid, blocks) => async (cid) => {
// fetch a block using its cid
// e.g.: const block = await fetchBlockByCID(cid)
blocks.push(cid)
return block
}
// collect blocks in this DAG starting from the root `cid`
const blocks = []
await walk({ cid, load: load(cid, blocks) })
console.log(blocks)
//> [CID(bagaaierasords4njcts6vs7qvdjfcvgnume4hqohf65zsfguprqphs3icwea)]
```
## Legacy interface
[`blockcodec-to-ipld-format`](https://github.com/ipld/js-blockcodec-to-ipld-format) converts a multiformats [`BlockCodec`](https://github.com/multiformats/js-multiformats/blob/master/src/codecs/interface.ts#L21) into an
[`interface-ipld-format`](https://github.com/ipld/interface-ipld-format) for use with the [`ipld`](https://github.com/ipld/ipld) package. This can help bridge IPLD codecs implemented using the structure and interfaces defined here to existing code that assumes, or requires `interface-ipld-format`. This bridge also includes the relevant TypeScript definitions.
## Implementations
By default, no base encodings (other than base32 & base58btc), hash functions,
or codec implementations are exposed by `multiformats`, you need to
import the ones you need yourself.
### Multibase codecs
| bases | import | repo |
| ------------------------------------------------------------- | --------------------------- | ------------------------------------------------------------------------------------------------- |
| `base16` | `multiformats/bases/base16` | [multiformats/js-multiformats](https://github.com/multiformats/js-multiformats/tree/master/bases) |
| `base32`, `base32pad`, `base32hex`, `base32hexpad`, `base32z` | `multiformats/bases/base32` | [multiformats/js-multiformats](https://github.com/multiformats/js-multiformats/tree/master/bases) |
| `base64`, `base64pad`, `base64url`, `base64urlpad` | `multiformats/bases/base64` | [multiformats/js-multiformats](https://github.com/multiformats/js-multiformats/tree/master/bases) |
| `base58btc`, `base58flick4` | `multiformats/bases/base58` | [multiformats/js-multiformats](https://github.com/multiformats/js-multiformats/tree/master/bases) |
Other (less useful) bases implemented in [multiformats/js-multiformats](https://github.com/multiformats/js-multiformats/tree/master/bases) include: `base2`, `base8`, `base10`, `base36` and `base256emoji`.
### Multihash hashers
| hashes | import | repo |
| ------------------------------------------------------------------------------------------------------------------------------- | ------------------------------ | ------------------------------------------------------------------------------------------------------------------ |
| `sha2-256`, `sha2-512` | `multiformats/hashes/sha2` | [multiformats/js-multiformats](https://github.com/multiformats/js-multiformats/tree/master/src/hashes) |
| `sha3-224`, `sha3-256`, `sha3-384`,`sha3-512`, `shake-128`, `shake-256`, `keccak-224`, `keccak-256`, `keccak-384`, `keccak-512` | `@multiformats/sha3` | [multiformats/js-sha3](https://github.com/multiformats/js-sha3) |
| `identity` | `multiformats/hashes/identity` | [multiformats/js-multiformats](https://github.com/multiformats/js-multiformats/tree/master/src/hashes/identity.js) |
| `murmur3-128`, `murmur3-32` | `@multiformats/murmur3` | [multiformats/js-murmur3](https://github.com/multiformats/js-murmur3) |
| `blake2b-*`, `blake2s-*` | `@multiformats/blake2` | [multiformats/js-blake2](https://github.com/multiformats/js-blake2) |
### IPLD codecs (multicodec)
| codec | import | repo |
| ---------- | -------------------------- | ------------------------------------------------------------------------------------------------------ |
| `raw` | `multiformats/codecs/raw` | [multiformats/js-multiformats](https://github.com/multiformats/js-multiformats/tree/master/src/codecs) |
| `json` | `multiformats/codecs/json` | [multiformats/js-multiformats](https://github.com/multiformats/js-multiformats/tree/master/src/codecs) |
| `dag-cbor` | `@ipld/dag-cbor` | [ipld/js-dag-cbor](https://github.com/ipld/js-dag-cbor) |
| `dag-json` | `@ipld/dag-json` | [ipld/js-dag-json](https://github.com/ipld/js-dag-json) |
| `dag-pb` | `@ipld/dag-pb` | [ipld/js-dag-pb](https://github.com/ipld/js-dag-pb) |
| `dag-jose` | `dag-jose` | [ceramicnetwork/js-dag-jose](https://github.com/ceramicnetwork/js-dag-jose) |
# Install
```console
$ npm i multiformats
```
## Browser `<script>` tag
Loading this module through a script tag will make its exports available as `Multiformats` in the global namespace.
```html
<script src="https://unpkg.com/multiformats/dist/index.min.js"></script>
```
# API Docs
- <https://multiformats.github.io/js-multiformats>
# License
Licensed under either of
- Apache 2.0, ([LICENSE-APACHE](https://github.com/multiformats/js-multiformats/LICENSE-APACHE) / <http://www.apache.org/licenses/LICENSE-2.0>)
- MIT ([LICENSE-MIT](https://github.com/multiformats/js-multiformats/LICENSE-MIT) / <http://opensource.org/licenses/MIT>)
# Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,74 @@
import type { BaseCodec, BaseDecoder, BaseEncoder, CombobaseDecoder, Multibase, MultibaseCodec, MultibaseDecoder, MultibaseEncoder, UnibaseDecoder } from './interface.js';
interface EncodeFn {
(bytes: Uint8Array): string;
}
interface DecodeFn {
(text: string): Uint8Array;
}
/**
* Class represents both BaseEncoder and MultibaseEncoder meaning it
* can be used to encode to multibase or base encode without multibase
* prefix.
*/
declare class Encoder<Base extends string, Prefix extends string> implements MultibaseEncoder<Prefix>, BaseEncoder {
readonly name: Base;
readonly prefix: Prefix;
readonly baseEncode: EncodeFn;
constructor(name: Base, prefix: Prefix, baseEncode: EncodeFn);
encode(bytes: Uint8Array): Multibase<Prefix>;
}
/**
* Class represents both BaseDecoder and MultibaseDecoder so it could be used
* to decode multibases (with matching prefix) or just base decode strings
* with corresponding base encoding.
*/
declare class Decoder<Base extends string, Prefix extends string> implements MultibaseDecoder<Prefix>, UnibaseDecoder<Prefix>, BaseDecoder {
readonly name: Base;
readonly prefix: Prefix;
readonly baseDecode: DecodeFn;
private readonly prefixCodePoint;
constructor(name: Base, prefix: Prefix, baseDecode: DecodeFn);
decode(text: string): Uint8Array;
or<OtherPrefix extends string>(decoder: UnibaseDecoder<OtherPrefix> | ComposedDecoder<OtherPrefix>): ComposedDecoder<Prefix | OtherPrefix>;
}
type Decoders<Prefix extends string> = Record<Prefix, UnibaseDecoder<Prefix>>;
declare class ComposedDecoder<Prefix extends string> implements MultibaseDecoder<Prefix>, CombobaseDecoder<Prefix> {
readonly decoders: Decoders<Prefix>;
constructor(decoders: Decoders<Prefix>);
or<OtherPrefix extends string>(decoder: UnibaseDecoder<OtherPrefix> | ComposedDecoder<OtherPrefix>): ComposedDecoder<Prefix | OtherPrefix>;
decode(input: string): Uint8Array;
}
export declare function or<L extends string, R extends string>(left: UnibaseDecoder<L> | CombobaseDecoder<L>, right: UnibaseDecoder<R> | CombobaseDecoder<R>): ComposedDecoder<L | R>;
export declare class Codec<Base extends string, Prefix extends string> implements MultibaseCodec<Prefix>, MultibaseEncoder<Prefix>, MultibaseDecoder<Prefix>, BaseCodec, BaseEncoder, BaseDecoder {
readonly name: Base;
readonly prefix: Prefix;
readonly baseEncode: EncodeFn;
readonly baseDecode: DecodeFn;
readonly encoder: Encoder<Base, Prefix>;
readonly decoder: Decoder<Base, Prefix>;
constructor(name: Base, prefix: Prefix, baseEncode: EncodeFn, baseDecode: DecodeFn);
encode(input: Uint8Array): string;
decode(input: string): Uint8Array;
}
export declare function from<Base extends string, Prefix extends string>({ name, prefix, encode, decode }: {
name: Base;
prefix: Prefix;
encode: EncodeFn;
decode: DecodeFn;
}): Codec<Base, Prefix>;
export declare function baseX<Base extends string, Prefix extends string>({ name, prefix, alphabet }: {
name: Base;
prefix: Prefix;
alphabet: string;
}): Codec<Base, Prefix>;
/**
* RFC4648 Factory
*/
export declare function rfc4648<Base extends string, Prefix extends string>({ name, prefix, bitsPerChar, alphabet }: {
name: Base;
prefix: Prefix;
bitsPerChar: number;
alphabet: string;
}): Codec<Base, Prefix>;
export {};
//# sourceMappingURL=base.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/bases/base.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,206 @@
import { coerce } from '../bytes.js';
import basex from '../vendor/base-x.js';
/**
* Class represents both BaseEncoder and MultibaseEncoder meaning it
* can be used to encode to multibase or base encode without multibase
* prefix.
*/
class Encoder {
name;
prefix;
baseEncode;
constructor(name, prefix, baseEncode) {
this.name = name;
this.prefix = prefix;
this.baseEncode = baseEncode;
}
encode(bytes) {
if (bytes instanceof Uint8Array) {
return `${this.prefix}${this.baseEncode(bytes)}`;
}
else {
throw Error('Unknown type, must be binary type');
}
}
}
/**
* Class represents both BaseDecoder and MultibaseDecoder so it could be used
* to decode multibases (with matching prefix) or just base decode strings
* with corresponding base encoding.
*/
class Decoder {
name;
prefix;
baseDecode;
prefixCodePoint;
constructor(name, prefix, baseDecode) {
this.name = name;
this.prefix = prefix;
const prefixCodePoint = prefix.codePointAt(0);
/* c8 ignore next 3 */
if (prefixCodePoint === undefined) {
throw new Error('Invalid prefix character');
}
this.prefixCodePoint = prefixCodePoint;
this.baseDecode = baseDecode;
}
decode(text) {
if (typeof text === 'string') {
if (text.codePointAt(0) !== this.prefixCodePoint) {
throw Error(`Unable to decode multibase string ${JSON.stringify(text)}, ${this.name} decoder only supports inputs prefixed with ${this.prefix}`);
}
return this.baseDecode(text.slice(this.prefix.length));
}
else {
throw Error('Can only multibase decode strings');
}
}
or(decoder) {
return or(this, decoder);
}
}
class ComposedDecoder {
decoders;
constructor(decoders) {
this.decoders = decoders;
}
or(decoder) {
return or(this, decoder);
}
decode(input) {
const prefix = input[0];
const decoder = this.decoders[prefix];
if (decoder != null) {
return decoder.decode(input);
}
else {
throw RangeError(`Unable to decode multibase string ${JSON.stringify(input)}, only inputs prefixed with ${Object.keys(this.decoders)} are supported`);
}
}
}
export function or(left, right) {
return new ComposedDecoder({
...(left.decoders ?? { [left.prefix]: left }),
...(right.decoders ?? { [right.prefix]: right })
});
}
export class Codec {
name;
prefix;
baseEncode;
baseDecode;
encoder;
decoder;
constructor(name, prefix, baseEncode, baseDecode) {
this.name = name;
this.prefix = prefix;
this.baseEncode = baseEncode;
this.baseDecode = baseDecode;
this.encoder = new Encoder(name, prefix, baseEncode);
this.decoder = new Decoder(name, prefix, baseDecode);
}
encode(input) {
return this.encoder.encode(input);
}
decode(input) {
return this.decoder.decode(input);
}
}
export function from({ name, prefix, encode, decode }) {
return new Codec(name, prefix, encode, decode);
}
export function baseX({ name, prefix, alphabet }) {
const { encode, decode } = basex(alphabet, name);
return from({
prefix,
name,
encode,
decode: (text) => coerce(decode(text))
});
}
function decode(string, alphabetIdx, bitsPerChar, name) {
// Count the padding bytes:
let end = string.length;
while (string[end - 1] === '=') {
--end;
}
// Allocate the output:
const out = new Uint8Array((end * bitsPerChar / 8) | 0);
// Parse the data:
let bits = 0; // Number of bits currently in the buffer
let buffer = 0; // Bits waiting to be written out, MSB first
let written = 0; // Next byte to write
for (let i = 0; i < end; ++i) {
// Read one character from the string:
const value = alphabetIdx[string[i]];
if (value === undefined) {
throw new SyntaxError(`Non-${name} character`);
}
// Append the bits to the buffer:
buffer = (buffer << bitsPerChar) | value;
bits += bitsPerChar;
// Write out some bits if the buffer has a byte's worth:
if (bits >= 8) {
bits -= 8;
out[written++] = 0xff & (buffer >> bits);
}
}
// Verify that we have received just enough bits:
if (bits >= bitsPerChar || (0xff & (buffer << (8 - bits))) !== 0) {
throw new SyntaxError('Unexpected end of data');
}
return out;
}
function encode(data, alphabet, bitsPerChar) {
const pad = alphabet[alphabet.length - 1] === '=';
const mask = (1 << bitsPerChar) - 1;
let out = '';
let bits = 0; // Number of bits currently in the buffer
let buffer = 0; // Bits waiting to be written out, MSB first
for (let i = 0; i < data.length; ++i) {
// Slurp data into the buffer:
buffer = (buffer << 8) | data[i];
bits += 8;
// Write out as much as we can:
while (bits > bitsPerChar) {
bits -= bitsPerChar;
out += alphabet[mask & (buffer >> bits)];
}
}
// Partial character:
if (bits !== 0) {
out += alphabet[mask & (buffer << (bitsPerChar - bits))];
}
// Add padding characters until we hit a byte boundary:
if (pad) {
while (((out.length * bitsPerChar) & 7) !== 0) {
out += '=';
}
}
return out;
}
function createAlphabetIdx(alphabet) {
// Build the character lookup table:
const alphabetIdx = {};
for (let i = 0; i < alphabet.length; ++i) {
alphabetIdx[alphabet[i]] = i;
}
return alphabetIdx;
}
/**
* RFC4648 Factory
*/
export function rfc4648({ name, prefix, bitsPerChar, alphabet }) {
const alphabetIdx = createAlphabetIdx(alphabet);
return from({
prefix,
name,
encode(input) {
return encode(input, alphabet, bitsPerChar);
},
decode(input) {
return decode(input, alphabetIdx, bitsPerChar, name);
}
});
}
//# sourceMappingURL=base.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,2 @@
export declare const base10: import("./base.js").Codec<"base10", "9">;
//# sourceMappingURL=base10.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"base10.d.ts","sourceRoot":"","sources":["../../../src/bases/base10.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,0CAIjB,CAAA"}

View File

@@ -0,0 +1,7 @@
import { baseX } from './base.js';
export const base10 = baseX({
prefix: '9',
name: 'base10',
alphabet: '0123456789'
});
//# sourceMappingURL=base10.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"base10.js","sourceRoot":"","sources":["../../../src/bases/base10.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AAEjC,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,CAAC;IAC1B,MAAM,EAAE,GAAG;IACX,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,YAAY;CACvB,CAAC,CAAA"}

View File

@@ -0,0 +1,3 @@
export declare const base16: import("./base.js").Codec<"base16", "f">;
export declare const base16upper: import("./base.js").Codec<"base16upper", "F">;
//# sourceMappingURL=base16.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"base16.d.ts","sourceRoot":"","sources":["../../../src/bases/base16.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,0CAKjB,CAAA;AAEF,eAAO,MAAM,WAAW,+CAKtB,CAAA"}

View File

@@ -0,0 +1,14 @@
import { rfc4648 } from './base.js';
export const base16 = rfc4648({
prefix: 'f',
name: 'base16',
alphabet: '0123456789abcdef',
bitsPerChar: 4
});
export const base16upper = rfc4648({
prefix: 'F',
name: 'base16upper',
alphabet: '0123456789ABCDEF',
bitsPerChar: 4
});
//# sourceMappingURL=base16.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"base16.js","sourceRoot":"","sources":["../../../src/bases/base16.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,MAAM,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC;IAC5B,MAAM,EAAE,GAAG;IACX,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,kBAAkB;IAC5B,WAAW,EAAE,CAAC;CACf,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;IACjC,MAAM,EAAE,GAAG;IACX,IAAI,EAAE,aAAa;IACnB,QAAQ,EAAE,kBAAkB;IAC5B,WAAW,EAAE,CAAC;CACf,CAAC,CAAA"}

View File

@@ -0,0 +1,2 @@
export declare const base2: import("./base.js").Codec<"base2", "0">;
//# sourceMappingURL=base2.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"base2.d.ts","sourceRoot":"","sources":["../../../src/bases/base2.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,KAAK,yCAKhB,CAAA"}

View File

@@ -0,0 +1,8 @@
import { rfc4648 } from './base.js';
export const base2 = rfc4648({
prefix: '0',
name: 'base2',
alphabet: '01',
bitsPerChar: 1
});
//# sourceMappingURL=base2.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"base2.js","sourceRoot":"","sources":["../../../src/bases/base2.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,MAAM,CAAC,MAAM,KAAK,GAAG,OAAO,CAAC;IAC3B,MAAM,EAAE,GAAG;IACX,IAAI,EAAE,OAAO;IACb,QAAQ,EAAE,IAAI;IACd,WAAW,EAAE,CAAC;CACf,CAAC,CAAA"}

View File

@@ -0,0 +1,2 @@
export declare const base256emoji: import("./base.js").Codec<"base256emoji", "🚀">;
//# sourceMappingURL=base256emoji.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"base256emoji.d.ts","sourceRoot":"","sources":["../../../src/bases/base256emoji.ts"],"names":[],"mappings":"AAoCA,eAAO,MAAM,YAAY,iDAKvB,CAAA"}

View File

@@ -0,0 +1,39 @@
import { from } from './base.js';
const alphabet = Array.from('🚀🪐☄🛰🌌🌑🌒🌓🌔🌕🌖🌗🌘🌍🌏🌎🐉☀💻🖥💾💿😂❤😍🤣😊🙏💕😭😘👍😅👏😁🔥🥰💔💖💙😢🤔😆🙄💪😉☺👌🤗💜😔😎😇🌹🤦🎉💞✌✨🤷😱😌🌸🙌😋💗💚😏💛🙂💓🤩😄😀🖤😃💯🙈👇🎶😒🤭❣😜💋👀😪😑💥🙋😞😩😡🤪👊🥳😥🤤👉💃😳✋😚😝😴🌟😬🙃🍀🌷😻😓⭐✅🥺🌈😈🤘💦✔😣🏃💐☹🎊💘😠☝😕🌺🎂🌻😐🖕💝🙊😹🗣💫💀👑🎵🤞😛🔴😤🌼😫⚽🤙☕🏆🤫👈😮🙆🍻🍃🐶💁😲🌿🧡🎁⚡🌞🎈❌✊👋😰🤨😶🤝🚶💰🍓💢🤟🙁🚨💨🤬✈🎀🍺🤓😙💟🌱😖👶🥴▶➡❓💎💸⬇😨🌚🦋😷🕺⚠🙅😟😵👎🤲🤠🤧📌🔵💅🧐🐾🍒😗🤑🌊🤯🐷☎💧😯💆👆🎤🙇🍑❄🌴💣🐸💌📍🥀🤢👅💡💩👐📸👻🤐🤮🎼🥵🚩🍎🍊👼💍📣🥂');
const alphabetBytesToChars = (alphabet.reduce((p, c, i) => { p[i] = c; return p; }, ([])));
const alphabetCharsToBytes = (alphabet.reduce((p, c, i) => {
const codePoint = c.codePointAt(0);
if (codePoint == null) {
throw new Error(`Invalid character: ${c}`);
}
p[codePoint] = i;
return p;
}, ([])));
function encode(data) {
return data.reduce((p, c) => {
p += alphabetBytesToChars[c];
return p;
}, '');
}
function decode(str) {
const byts = [];
for (const char of str) {
const codePoint = char.codePointAt(0);
if (codePoint == null) {
throw new Error(`Invalid character: ${char}`);
}
const byt = alphabetCharsToBytes[codePoint];
if (byt == null) {
throw new Error(`Non-base256emoji character: ${char}`);
}
byts.push(byt);
}
return new Uint8Array(byts);
}
export const base256emoji = from({
prefix: '🚀',
name: 'base256emoji',
encode,
decode
});
//# sourceMappingURL=base256emoji.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"base256emoji.js","sourceRoot":"","sources":["../../../src/bases/base256emoji.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,weAAwe,CAAC,CAAA;AACrgB,MAAM,oBAAoB,GAAa,CAAC,QAAQ,CAAC,MAAM,CAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;AAC7G,MAAM,oBAAoB,GAAa,CAAC,QAAQ,CAAC,MAAM,CAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;IAC5E,MAAM,SAAS,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;IAClC,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAA;IAC5C,CAAC;IACD,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;IAChB,OAAO,CAAC,CAAA;AACV,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;AAET,SAAS,MAAM,CAAE,IAAgB;IAC/B,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC1B,CAAC,IAAI,oBAAoB,CAAC,CAAC,CAAC,CAAA;QAC5B,OAAO,CAAC,CAAA;IACV,CAAC,EAAE,EAAE,CAAC,CAAA;AACR,CAAC;AAED,SAAS,MAAM,CAAE,GAAW;IAC1B,MAAM,IAAI,GAAG,EAAE,CAAA;IACf,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;QACrC,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAA;QAC/C,CAAC;QACD,MAAM,GAAG,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAA;QAC3C,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAA;QACxD,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAChB,CAAC;IACD,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,CAAA;AAC7B,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,IAAI;IACZ,IAAI,EAAE,cAAc;IACpB,MAAM;IACN,MAAM;CACP,CAAC,CAAA"}

View File

@@ -0,0 +1,10 @@
export declare const base32: import("./base.js").Codec<"base32", "b">;
export declare const base32upper: import("./base.js").Codec<"base32upper", "B">;
export declare const base32pad: import("./base.js").Codec<"base32pad", "c">;
export declare const base32padupper: import("./base.js").Codec<"base32padupper", "C">;
export declare const base32hex: import("./base.js").Codec<"base32hex", "v">;
export declare const base32hexupper: import("./base.js").Codec<"base32hexupper", "V">;
export declare const base32hexpad: import("./base.js").Codec<"base32hexpad", "t">;
export declare const base32hexpadupper: import("./base.js").Codec<"base32hexpadupper", "T">;
export declare const base32z: import("./base.js").Codec<"base32z", "h">;
//# sourceMappingURL=base32.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"base32.d.ts","sourceRoot":"","sources":["../../../src/bases/base32.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,0CAKjB,CAAA;AAEF,eAAO,MAAM,WAAW,+CAKtB,CAAA;AAEF,eAAO,MAAM,SAAS,6CAKpB,CAAA;AAEF,eAAO,MAAM,cAAc,kDAKzB,CAAA;AAEF,eAAO,MAAM,SAAS,6CAKpB,CAAA;AAEF,eAAO,MAAM,cAAc,kDAKzB,CAAA;AAEF,eAAO,MAAM,YAAY,gDAKvB,CAAA;AAEF,eAAO,MAAM,iBAAiB,qDAK5B,CAAA;AAEF,eAAO,MAAM,OAAO,2CAKlB,CAAA"}

View File

@@ -0,0 +1,56 @@
import { rfc4648 } from './base.js';
export const base32 = rfc4648({
prefix: 'b',
name: 'base32',
alphabet: 'abcdefghijklmnopqrstuvwxyz234567',
bitsPerChar: 5
});
export const base32upper = rfc4648({
prefix: 'B',
name: 'base32upper',
alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567',
bitsPerChar: 5
});
export const base32pad = rfc4648({
prefix: 'c',
name: 'base32pad',
alphabet: 'abcdefghijklmnopqrstuvwxyz234567=',
bitsPerChar: 5
});
export const base32padupper = rfc4648({
prefix: 'C',
name: 'base32padupper',
alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=',
bitsPerChar: 5
});
export const base32hex = rfc4648({
prefix: 'v',
name: 'base32hex',
alphabet: '0123456789abcdefghijklmnopqrstuv',
bitsPerChar: 5
});
export const base32hexupper = rfc4648({
prefix: 'V',
name: 'base32hexupper',
alphabet: '0123456789ABCDEFGHIJKLMNOPQRSTUV',
bitsPerChar: 5
});
export const base32hexpad = rfc4648({
prefix: 't',
name: 'base32hexpad',
alphabet: '0123456789abcdefghijklmnopqrstuv=',
bitsPerChar: 5
});
export const base32hexpadupper = rfc4648({
prefix: 'T',
name: 'base32hexpadupper',
alphabet: '0123456789ABCDEFGHIJKLMNOPQRSTUV=',
bitsPerChar: 5
});
export const base32z = rfc4648({
prefix: 'h',
name: 'base32z',
alphabet: 'ybndrfg8ejkmcpqxot1uwisza345h769',
bitsPerChar: 5
});
//# sourceMappingURL=base32.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"base32.js","sourceRoot":"","sources":["../../../src/bases/base32.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,MAAM,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC;IAC5B,MAAM,EAAE,GAAG;IACX,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,kCAAkC;IAC5C,WAAW,EAAE,CAAC;CACf,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;IACjC,MAAM,EAAE,GAAG;IACX,IAAI,EAAE,aAAa;IACnB,QAAQ,EAAE,kCAAkC;IAC5C,WAAW,EAAE,CAAC;CACf,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,OAAO,CAAC;IAC/B,MAAM,EAAE,GAAG;IACX,IAAI,EAAE,WAAW;IACjB,QAAQ,EAAE,mCAAmC;IAC7C,WAAW,EAAE,CAAC;CACf,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;IACpC,MAAM,EAAE,GAAG;IACX,IAAI,EAAE,gBAAgB;IACtB,QAAQ,EAAE,mCAAmC;IAC7C,WAAW,EAAE,CAAC;CACf,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,OAAO,CAAC;IAC/B,MAAM,EAAE,GAAG;IACX,IAAI,EAAE,WAAW;IACjB,QAAQ,EAAE,kCAAkC;IAC5C,WAAW,EAAE,CAAC;CACf,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC;IACpC,MAAM,EAAE,GAAG;IACX,IAAI,EAAE,gBAAgB;IACtB,QAAQ,EAAE,kCAAkC;IAC5C,WAAW,EAAE,CAAC;CACf,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC;IAClC,MAAM,EAAE,GAAG;IACX,IAAI,EAAE,cAAc;IACpB,QAAQ,EAAE,mCAAmC;IAC7C,WAAW,EAAE,CAAC;CACf,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,OAAO,CAAC;IACvC,MAAM,EAAE,GAAG;IACX,IAAI,EAAE,mBAAmB;IACzB,QAAQ,EAAE,mCAAmC;IAC7C,WAAW,EAAE,CAAC;CACf,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;IAC7B,MAAM,EAAE,GAAG;IACX,IAAI,EAAE,SAAS;IACf,QAAQ,EAAE,kCAAkC;IAC5C,WAAW,EAAE,CAAC;CACf,CAAC,CAAA"}

View File

@@ -0,0 +1,3 @@
export declare const base36: import("./base.js").Codec<"base36", "k">;
export declare const base36upper: import("./base.js").Codec<"base36upper", "K">;
//# sourceMappingURL=base36.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"base36.d.ts","sourceRoot":"","sources":["../../../src/bases/base36.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,0CAIjB,CAAA;AAEF,eAAO,MAAM,WAAW,+CAItB,CAAA"}

View File

@@ -0,0 +1,12 @@
import { baseX } from './base.js';
export const base36 = baseX({
prefix: 'k',
name: 'base36',
alphabet: '0123456789abcdefghijklmnopqrstuvwxyz'
});
export const base36upper = baseX({
prefix: 'K',
name: 'base36upper',
alphabet: '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
});
//# sourceMappingURL=base36.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"base36.js","sourceRoot":"","sources":["../../../src/bases/base36.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AAEjC,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,CAAC;IAC1B,MAAM,EAAE,GAAG;IACX,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,sCAAsC;CACjD,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;IAC/B,MAAM,EAAE,GAAG;IACX,IAAI,EAAE,aAAa;IACnB,QAAQ,EAAE,sCAAsC;CACjD,CAAC,CAAA"}

View File

@@ -0,0 +1,3 @@
export declare const base58btc: import("./base.js").Codec<"base58btc", "z">;
export declare const base58flickr: import("./base.js").Codec<"base58flickr", "Z">;
//# sourceMappingURL=base58.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"base58.d.ts","sourceRoot":"","sources":["../../../src/bases/base58.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS,6CAIpB,CAAA;AAEF,eAAO,MAAM,YAAY,gDAIvB,CAAA"}

View File

@@ -0,0 +1,12 @@
import { baseX } from './base.js';
export const base58btc = baseX({
name: 'base58btc',
prefix: 'z',
alphabet: '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
});
export const base58flickr = baseX({
name: 'base58flickr',
prefix: 'Z',
alphabet: '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'
});
//# sourceMappingURL=base58.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"base58.js","sourceRoot":"","sources":["../../../src/bases/base58.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AAEjC,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,CAAC;IAC7B,IAAI,EAAE,WAAW;IACjB,MAAM,EAAE,GAAG;IACX,QAAQ,EAAE,4DAA4D;CACvE,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAC;IAChC,IAAI,EAAE,cAAc;IACpB,MAAM,EAAE,GAAG;IACX,QAAQ,EAAE,4DAA4D;CACvE,CAAC,CAAA"}

View File

@@ -0,0 +1,5 @@
export declare const base64: import("./base.js").Codec<"base64", "m">;
export declare const base64pad: import("./base.js").Codec<"base64pad", "M">;
export declare const base64url: import("./base.js").Codec<"base64url", "u">;
export declare const base64urlpad: import("./base.js").Codec<"base64urlpad", "U">;
//# sourceMappingURL=base64.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"base64.d.ts","sourceRoot":"","sources":["../../../src/bases/base64.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,0CAKjB,CAAA;AAEF,eAAO,MAAM,SAAS,6CAKpB,CAAA;AAEF,eAAO,MAAM,SAAS,6CAKpB,CAAA;AAEF,eAAO,MAAM,YAAY,gDAKvB,CAAA"}

View File

@@ -0,0 +1,26 @@
import { rfc4648 } from './base.js';
export const base64 = rfc4648({
prefix: 'm',
name: 'base64',
alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
bitsPerChar: 6
});
export const base64pad = rfc4648({
prefix: 'M',
name: 'base64pad',
alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',
bitsPerChar: 6
});
export const base64url = rfc4648({
prefix: 'u',
name: 'base64url',
alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',
bitsPerChar: 6
});
export const base64urlpad = rfc4648({
prefix: 'U',
name: 'base64urlpad',
alphabet: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=',
bitsPerChar: 6
});
//# sourceMappingURL=base64.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"base64.js","sourceRoot":"","sources":["../../../src/bases/base64.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,MAAM,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC;IAC5B,MAAM,EAAE,GAAG;IACX,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,kEAAkE;IAC5E,WAAW,EAAE,CAAC;CACf,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,OAAO,CAAC;IAC/B,MAAM,EAAE,GAAG;IACX,IAAI,EAAE,WAAW;IACjB,QAAQ,EAAE,mEAAmE;IAC7E,WAAW,EAAE,CAAC;CACf,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,OAAO,CAAC;IAC/B,MAAM,EAAE,GAAG;IACX,IAAI,EAAE,WAAW;IACjB,QAAQ,EAAE,kEAAkE;IAC5E,WAAW,EAAE,CAAC;CACf,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC;IAClC,MAAM,EAAE,GAAG;IACX,IAAI,EAAE,cAAc;IACpB,QAAQ,EAAE,mEAAmE;IAC7E,WAAW,EAAE,CAAC;CACf,CAAC,CAAA"}

View File

@@ -0,0 +1,2 @@
export declare const base8: import("./base.js").Codec<"base8", "7">;
//# sourceMappingURL=base8.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"base8.d.ts","sourceRoot":"","sources":["../../../src/bases/base8.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,KAAK,yCAKhB,CAAA"}

View File

@@ -0,0 +1,8 @@
import { rfc4648 } from './base.js';
export const base8 = rfc4648({
prefix: '7',
name: 'base8',
alphabet: '01234567',
bitsPerChar: 3
});
//# sourceMappingURL=base8.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"base8.js","sourceRoot":"","sources":["../../../src/bases/base8.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,MAAM,CAAC,MAAM,KAAK,GAAG,OAAO,CAAC;IAC3B,MAAM,EAAE,GAAG;IACX,IAAI,EAAE,OAAO;IACb,QAAQ,EAAE,UAAU;IACpB,WAAW,EAAE,CAAC;CACf,CAAC,CAAA"}

View File

@@ -0,0 +1,2 @@
export declare const identity: import("./base.js").Codec<"identity", "\0">;
//# sourceMappingURL=identity.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../../src/bases/identity.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,QAAQ,6CAKnB,CAAA"}

View File

@@ -0,0 +1,9 @@
import { fromString, toString } from '../bytes.js';
import { from } from './base.js';
export const identity = from({
prefix: '\x00',
name: 'identity',
encode: (buf) => toString(buf),
decode: (str) => fromString(str)
});
//# sourceMappingURL=identity.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../../src/bases/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM;IACd,IAAI,EAAE,UAAU;IAChB,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC;IAC9B,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;CACjC,CAAC,CAAA"}

View File

@@ -0,0 +1,83 @@
/**
* Base encoder just encodes bytes into base encoded string.
*/
export interface BaseEncoder {
/**
* Base encodes to a **plain** (and not a multibase) string. Unlike
* `encode` no multibase prefix is added.
*/
baseEncode(bytes: Uint8Array): string;
}
/**
* Base decoder decodes encoded with matching base encoding into bytes.
*/
export interface BaseDecoder {
/**
* Decodes **plain** (and not a multibase) string. Unlike
* decode
*/
baseDecode(text: string): Uint8Array;
}
/**
* Base codec is just dual of encoder and decoder.
*/
export interface BaseCodec {
encoder: BaseEncoder;
decoder: BaseDecoder;
}
/**
* Multibase represents base encoded strings with a prefix first character
* describing it's encoding.
*/
export type Multibase<Prefix extends string> = string | string & {
[0]: Prefix;
};
/**
* Multibase encoder for the specific base encoding encodes bytes into
* multibase of that encoding.
*/
export interface MultibaseEncoder<Prefix extends string> {
/**
* Name of the encoding.
*/
name: string;
/**
* Prefix character for that base encoding.
*/
prefix: Prefix;
/**
* Encodes binary data into **multibase** string (which will have a
* prefix added).
*/
encode(bytes: Uint8Array): Multibase<Prefix>;
}
/**
* Interface implemented by multibase decoder, that takes multibase strings
* to bytes. It may support single encoding like base32 or multiple encodings
* like base32, base58btc, base64. If passed multibase is incompatible it will
* throw an exception.
*/
export interface MultibaseDecoder<Prefix extends string> {
/**
* Decodes **multibase** string (which must have a multibase prefix added).
* If prefix does not match
*/
decode(multibase: Multibase<Prefix>): Uint8Array;
}
/**
* Dual of multibase encoder and decoder.
*/
export interface MultibaseCodec<Prefix extends string> {
name: string;
prefix: Prefix;
encoder: MultibaseEncoder<Prefix>;
decoder: MultibaseDecoder<Prefix>;
}
export interface UnibaseDecoder<Prefix extends string> extends MultibaseDecoder<Prefix> {
readonly decoders?: null;
readonly prefix: Prefix;
}
export interface CombobaseDecoder<Prefix extends string> extends MultibaseDecoder<Prefix> {
readonly decoders: Record<Prefix, UnibaseDecoder<Prefix>>;
}
//# sourceMappingURL=interface.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/bases/interface.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAAA;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAA;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,WAAW,CAAA;IACpB,OAAO,EAAE,WAAW,CAAA;CACrB;AAED;;;GAGG;AACH,MAAM,MAAM,SAAS,CAAC,MAAM,SAAS,MAAM,IACvC,MAAM,GACN,MAAM,GAAG;IAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAE5B;;;GAGG;AACH,MAAM,WAAW,gBAAgB,CAAC,MAAM,SAAS,MAAM;IACrD;;OAEG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,CAAA;CAC7C;AAED;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB,CAAC,MAAM,SAAS,MAAM;IACrD;;;OAGG;IACH,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,UAAU,CAAA;CACjD;AAED;;GAEG;AACH,MAAM,WAAW,cAAc,CAAC,MAAM,SAAS,MAAM;IACnD,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAA;IACjC,OAAO,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAA;CAClC;AAED,MAAM,WAAW,cAAc,CAAC,MAAM,SAAS,MAAM,CAAE,SAAQ,gBAAgB,CAAC,MAAM,CAAC;IAErF,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAA;IAExB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,gBAAgB,CAAC,MAAM,SAAS,MAAM,CAAE,SAAQ,gBAAgB,CAAC,MAAM,CAAC;IACvF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAAA;CAC1D"}

View File

@@ -0,0 +1,4 @@
// Base encoders / decoders just base encode / decode between binary and
// textual representation. They are unaware of multibase.
export {};
//# sourceMappingURL=interface.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../../src/bases/interface.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,yDAAyD"}

View File

@@ -0,0 +1,45 @@
import * as json from './codecs/json.js';
import * as raw from './codecs/raw.js';
import { CID, hasher, digest, varint, bytes } from './index.js';
export declare const bases: {
base256emoji: import("./bases/base.ts").Codec<"base256emoji", "🚀">;
base64: import("./bases/base.ts").Codec<"base64", "m">;
base64pad: import("./bases/base.ts").Codec<"base64pad", "M">;
base64url: import("./bases/base.ts").Codec<"base64url", "u">;
base64urlpad: import("./bases/base.ts").Codec<"base64urlpad", "U">;
base58btc: import("./bases/base.ts").Codec<"base58btc", "z">;
base58flickr: import("./bases/base.ts").Codec<"base58flickr", "Z">;
base36: import("./bases/base.ts").Codec<"base36", "k">;
base36upper: import("./bases/base.ts").Codec<"base36upper", "K">;
base32: import("./bases/base.ts").Codec<"base32", "b">;
base32upper: import("./bases/base.ts").Codec<"base32upper", "B">;
base32pad: import("./bases/base.ts").Codec<"base32pad", "c">;
base32padupper: import("./bases/base.ts").Codec<"base32padupper", "C">;
base32hex: import("./bases/base.ts").Codec<"base32hex", "v">;
base32hexupper: import("./bases/base.ts").Codec<"base32hexupper", "V">;
base32hexpad: import("./bases/base.ts").Codec<"base32hexpad", "t">;
base32hexpadupper: import("./bases/base.ts").Codec<"base32hexpadupper", "T">;
base32z: import("./bases/base.ts").Codec<"base32z", "h">;
base16: import("./bases/base.ts").Codec<"base16", "f">;
base16upper: import("./bases/base.ts").Codec<"base16upper", "F">;
base10: import("./bases/base.ts").Codec<"base10", "9">;
base8: import("./bases/base.ts").Codec<"base8", "7">;
base2: import("./bases/base.ts").Codec<"base2", "0">;
identity: import("./bases/base.ts").Codec<"identity", "\0">;
};
export declare const hashes: {
identity: {
code: 0;
name: string;
encode: (input: Uint8Array) => Uint8Array;
digest: (input: Uint8Array, options?: hasher.DigestOptions) => digest.Digest<0, number>;
};
sha256: hasher.Hasher<"sha2-256", 18>;
sha512: hasher.Hasher<"sha2-512", 19>;
};
export declare const codecs: {
raw: typeof raw;
json: typeof json;
};
export { CID, hasher, digest, varint, bytes };
//# sourceMappingURL=basics.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"basics.d.ts","sourceRoot":"","sources":["../../src/basics.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,IAAI,MAAM,kBAAkB,CAAA;AACxC,OAAO,KAAK,GAAG,MAAM,iBAAiB,CAAA;AAGtC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAE/D,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;CAA6H,CAAA;AAC/I,eAAO,MAAM,MAAM;;;;;;;;;CAA2B,CAAA;AAC9C,eAAO,MAAM,MAAM;;;CAAgB,CAAA;AAEnC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA"}

View File

@@ -0,0 +1,20 @@
import * as base10 from './bases/base10.js';
import * as base16 from './bases/base16.js';
import * as base2 from './bases/base2.js';
import * as base256emoji from './bases/base256emoji.js';
import * as base32 from './bases/base32.js';
import * as base36 from './bases/base36.js';
import * as base58 from './bases/base58.js';
import * as base64 from './bases/base64.js';
import * as base8 from './bases/base8.js';
import * as identityBase from './bases/identity.js';
import * as json from './codecs/json.js';
import * as raw from './codecs/raw.js';
import * as identity from './hashes/identity.js';
import * as sha2 from './hashes/sha2.js';
import { CID, hasher, digest, varint, bytes } from './index.js';
export const bases = { ...identityBase, ...base2, ...base8, ...base10, ...base16, ...base32, ...base36, ...base58, ...base64, ...base256emoji };
export const hashes = { ...sha2, ...identity };
export const codecs = { raw, json };
export { CID, hasher, digest, varint, bytes };
//# sourceMappingURL=basics.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"basics.js","sourceRoot":"","sources":["../../src/basics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAC3C,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAA;AACzC,OAAO,KAAK,YAAY,MAAM,yBAAyB,CAAA;AACvD,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAC3C,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAA;AACzC,OAAO,KAAK,YAAY,MAAM,qBAAqB,CAAA;AACnD,OAAO,KAAK,IAAI,MAAM,kBAAkB,CAAA;AACxC,OAAO,KAAK,GAAG,MAAM,iBAAiB,CAAA;AACtC,OAAO,KAAK,QAAQ,MAAM,sBAAsB,CAAA;AAChD,OAAO,KAAK,IAAI,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAE/D,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,GAAG,YAAY,EAAE,GAAG,KAAK,EAAE,GAAG,KAAK,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,YAAY,EAAE,CAAA;AAC/I,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAA;AAC9C,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAA;AAEnC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA"}

View File

@@ -0,0 +1,77 @@
import { CID } from './index.js';
import type * as API from './interface.js';
/**
* @template T - Logical type of the data encoded in the block
* @template C - multicodec code corresponding to codec used to encode the block
* @template A - multicodec code corresponding to the hashing algorithm used in CID creation.
* @template V - CID version
*/
export declare class Block<T, C extends number, A extends number, V extends API.Version> implements API.BlockView<T, C, A, V> {
readonly cid: CID<T, C, A, V>;
readonly bytes: API.ByteView<T>;
readonly value: T;
readonly asBlock: this;
constructor({ cid, bytes, value }: {
cid: CID<T, C, A, V>;
bytes: API.ByteView<T>;
value: T;
});
links(): Iterable<[string, CID<unknown, number, number, API.Version>]>;
tree(): Iterable<string>;
get(path?: string): API.BlockCursorView<unknown>;
}
interface EncodeInput<T, Code extends number, Alg extends number> {
value: T;
codec: API.BlockEncoder<Code, T>;
hasher: API.MultihashHasher<Alg>;
}
/**
* @template T - Logical type of the data encoded in the block
* @template Code - multicodec code corresponding to codec used to encode the block
* @template Alg - multicodec code corresponding to the hashing algorithm used in CID creation.
*/
export declare function encode<T, Code extends number, Alg extends number>({ value, codec, hasher }: EncodeInput<T, Code, Alg>): Promise<API.BlockView<T, Code, Alg>>;
interface DecodeInput<T, Code extends number, Alg extends number> {
bytes: API.ByteView<T>;
codec: API.BlockDecoder<Code, T>;
hasher: API.MultihashHasher<Alg>;
}
/**
* @template T - Logical type of the data encoded in the block
* @template Code - multicodec code corresponding to codec used to encode the block
* @template Alg - multicodec code corresponding to the hashing algorithm used in CID creation.
*/
export declare function decode<T, Code extends number, Alg extends number>({ bytes, codec, hasher }: DecodeInput<T, Code, Alg>): Promise<API.BlockView<T, Code, Alg>>;
type CreateUnsafeInput<T, Code extends number, Alg extends number, V extends API.Version> = {
cid: API.Link<T, Code, Alg, V>;
value: T;
codec?: API.BlockDecoder<Code, T>;
bytes: API.ByteView<T>;
} | {
cid: API.Link<T, Code, Alg, V>;
value?: undefined;
codec: API.BlockDecoder<Code, T>;
bytes: API.ByteView<T>;
};
/**
* @template T - Logical type of the data encoded in the block
* @template Code - multicodec code corresponding to codec used to encode the block
* @template Alg - multicodec code corresponding to the hashing algorithm used in CID creation.
* @template V - CID version
*/
export declare function createUnsafe<T, Code extends number, Alg extends number, V extends API.Version>({ bytes, cid, value: maybeValue, codec }: CreateUnsafeInput<T, Code, Alg, V>): API.BlockView<T, Code, Alg, V>;
interface CreateInput<T, Code extends number, Alg extends number, V extends API.Version> {
bytes: API.ByteView<T>;
cid: API.Link<T, Code, Alg, V>;
hasher: API.MultihashHasher<Alg>;
codec: API.BlockDecoder<Code, T>;
}
/**
* @template T - Logical type of the data encoded in the block
* @template Code - multicodec code corresponding to codec used to encode the block
* @template Alg - multicodec code corresponding to the hashing algorithm used in CID creation.
* @template V - CID version
*/
export declare function create<T, Code extends number, Alg extends number, V extends API.Version>({ bytes, cid, hasher, codec }: CreateInput<T, Code, Alg, V>): Promise<API.BlockView<T, Code, Alg, V>>;
export {};
//# sourceMappingURL=block.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"block.d.ts","sourceRoot":"","sources":["../../src/block.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,198 @@
import { bytes as binary, CID } from './index.js';
function readonly({ enumerable = true, configurable = false } = {}) {
return { enumerable, configurable, writable: false };
}
function* linksWithin(path, value) {
if (value != null && typeof value === 'object') {
if (Array.isArray(value)) {
for (const [index, element] of value.entries()) {
const elementPath = [...path, index];
const cid = CID.asCID(element);
if (cid != null) {
yield [elementPath.join('/'), cid];
}
else if (typeof element === 'object') {
yield* links(element, elementPath);
}
}
}
else {
const cid = CID.asCID(value);
if (cid != null) {
yield [path.join('/'), cid];
}
else {
yield* links(value, path);
}
}
}
}
function* links(source, base) {
if (source == null || source instanceof Uint8Array) {
return;
}
const cid = CID.asCID(source);
if (cid != null) {
yield [base.join('/'), cid];
}
for (const [key, value] of Object.entries(source)) {
const path = [...base, key];
yield* linksWithin(path, value);
}
}
function* treeWithin(path, value) {
if (Array.isArray(value)) {
for (const [index, element] of value.entries()) {
const elementPath = [...path, index];
yield elementPath.join('/');
if (typeof element === 'object' && (CID.asCID(element) == null)) {
yield* tree(element, elementPath);
}
}
}
else {
yield* tree(value, path);
}
}
function* tree(source, base) {
if (source == null || typeof source !== 'object') {
return;
}
for (const [key, value] of Object.entries(source)) {
const path = [...base, key];
yield path.join('/');
if (value != null && !(value instanceof Uint8Array) && typeof value === 'object' && (CID.asCID(value) == null)) {
yield* treeWithin(path, value);
}
}
}
function get(source, path) {
let node = source;
for (const [index, key] of path.entries()) {
node = node[key];
if (node == null) {
throw new Error(`Object has no property at ${path.slice(0, index + 1).map(part => `[${JSON.stringify(part)}]`).join('')}`);
}
const cid = CID.asCID(node);
if (cid != null) {
return { value: cid, remaining: path.slice(index + 1).join('/') };
}
}
return { value: node };
}
/**
* @template T - Logical type of the data encoded in the block
* @template C - multicodec code corresponding to codec used to encode the block
* @template A - multicodec code corresponding to the hashing algorithm used in CID creation.
* @template V - CID version
*/
export class Block {
cid;
bytes;
value;
asBlock;
constructor({ cid, bytes, value }) {
if (cid == null || bytes == null || typeof value === 'undefined') {
throw new Error('Missing required argument');
}
this.cid = cid;
this.bytes = bytes;
this.value = value;
this.asBlock = this;
// Mark all the properties immutable
Object.defineProperties(this, {
cid: readonly(),
bytes: readonly(),
value: readonly(),
asBlock: readonly()
});
}
links() {
return links(this.value, []);
}
tree() {
return tree(this.value, []);
}
get(path = '/') {
return get(this.value, path.split('/').filter(Boolean));
}
}
/**
* @template T - Logical type of the data encoded in the block
* @template Code - multicodec code corresponding to codec used to encode the block
* @template Alg - multicodec code corresponding to the hashing algorithm used in CID creation.
*/
export async function encode({ value, codec, hasher }) {
if (typeof value === 'undefined') {
throw new Error('Missing required argument "value"');
}
if (codec == null || hasher == null) {
throw new Error('Missing required argument: codec or hasher');
}
const bytes = codec.encode(value);
const hash = await hasher.digest(bytes);
const cid = CID.create(1, codec.code, hash);
return new Block({ value, bytes, cid });
}
/**
* @template T - Logical type of the data encoded in the block
* @template Code - multicodec code corresponding to codec used to encode the block
* @template Alg - multicodec code corresponding to the hashing algorithm used in CID creation.
*/
export async function decode({ bytes, codec, hasher }) {
if (bytes == null) {
throw new Error('Missing required argument "bytes"');
}
if (codec == null || hasher == null) {
throw new Error('Missing required argument: codec or hasher');
}
const value = codec.decode(bytes);
const hash = await hasher.digest(bytes);
const cid = CID.create(1, codec.code, hash);
return new Block({ value, bytes, cid });
}
/**
* @template T - Logical type of the data encoded in the block
* @template Code - multicodec code corresponding to codec used to encode the block
* @template Alg - multicodec code corresponding to the hashing algorithm used in CID creation.
* @template V - CID version
*/
export function createUnsafe({ bytes, cid, value: maybeValue, codec }) {
const value = maybeValue !== undefined
? maybeValue
: (codec?.decode(bytes));
if (value === undefined) {
throw new Error('Missing required argument, must either provide "value" or "codec"');
}
return new Block({
cid: cid,
bytes,
value
});
}
/**
* @template T - Logical type of the data encoded in the block
* @template Code - multicodec code corresponding to codec used to encode the block
* @template Alg - multicodec code corresponding to the hashing algorithm used in CID creation.
* @template V - CID version
*/
export async function create({ bytes, cid, hasher, codec }) {
if (bytes == null) {
throw new Error('Missing required argument "bytes"');
}
if (hasher == null) {
throw new Error('Missing required argument "hasher"');
}
const value = codec.decode(bytes);
const hash = await hasher.digest(bytes);
if (!binary.equals(cid.multihash.bytes, hash.bytes)) {
throw new Error('CID hash does not match bytes');
}
return createUnsafe({
bytes,
cid,
value,
codec
});
}
//# sourceMappingURL=block.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,63 @@
import type { CID } from '../cid.js';
import type { Link, Version } from '../link/interface.js';
/**
* A byte-encoded representation of some type of `Data`.
*
* A `ByteView` is essentially a `Uint8Array` that's been "tagged" with
* a `Data` type parameter indicating the type of encoded data.
*
* For example, a `ByteView<{ hello: "world" }>` is a `Uint8Array` containing a
* binary representation of a `{hello: "world"}`.
*/
export interface ByteView<Data> extends Uint8Array, Phantom<Data> {
}
/**
* Similar to ByteView but extends ArrayBuffer.
*/
export interface ArrayBufferView<Data> extends ArrayBuffer, Phantom<Data> {
}
declare const Marker: unique symbol;
/**
* A utility type to retain an unused type parameter `T`.
* Similar to [phantom type parameters in Rust](https://doc.rust-lang.org/rust-by-example/generics/phantom.html).
*
* Capturing unused type parameters allows us to define "nominal types," which
* TypeScript does not natively support. Nominal types in turn allow us to capture
* semantics not represented in the actual type structure, without requiring us to define
* new classes or pay additional runtime costs.
*
* For a concrete example, see {@link ByteView}, which extends the `Uint8Array` type to capture
* type information about the structure of the data encoded into the array.
*/
export interface Phantom<T> {
[Marker]?: T;
}
/**
* Represents an IPLD block (including its CID) that can be decoded to data of
* type `T`.
*
* @template T - Logical type of the data encoded in the block
* @template C - multicodec code corresponding to codec used to encode the block
* @template A - multicodec code corresponding to the hashing algorithm used in CID creation.
* @template V - CID version
*/
export interface Block<T = unknown, C extends number = number, A extends number = number, V extends Version = 1> {
bytes: ByteView<T>;
cid: Link<T, C, A, V>;
}
export type BlockCursorView<T = unknown> = {
value: T;
remaining?: undefined;
} | {
value: CID;
remaining: string;
};
export interface BlockView<T = unknown, C extends number = number, A extends number = number, V extends Version = 1> extends Block<T, C, A, V> {
cid: CID<T, C, A, V>;
value: T;
links(): Iterable<[string, CID]>;
tree(): Iterable<string>;
get(path: string): BlockCursorView<unknown>;
}
export {};
//# sourceMappingURL=interface.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/block/interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAEzD;;;;;;;;GAQG;AACH,MAAM,WAAW,QAAQ,CAAC,IAAI,CAAE,SAAQ,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC;CAAG;AAEpE;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,IAAI,CAAE,SAAQ,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC;CAAG;AAE5E,OAAO,CAAC,MAAM,MAAM,EAAE,OAAO,MAAM,CAAA;AAEnC;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,OAAO,CAAC,CAAC;IAIxB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAA;CACb;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,KAAK,CACpB,CAAC,GAAG,OAAO,EACX,CAAC,SAAS,MAAM,GAAG,MAAM,EACzB,CAAC,SAAS,MAAM,GAAG,MAAM,EACzB,CAAC,SAAS,OAAO,GAAG,CAAC;IAErB,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAA;IAClB,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;CACtB;AAED,MAAM,MAAM,eAAe,CAAC,CAAC,GAAG,OAAO,IACnC;IAAE,KAAK,EAAE,CAAC,CAAC;IAAC,SAAS,CAAC,EAAE,SAAS,CAAA;CAAE,GACnC;IAAE,KAAK,EAAE,GAAG,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAA;AAErC,MAAM,WAAW,SAAS,CACxB,CAAC,GAAG,OAAO,EACX,CAAC,SAAS,MAAM,GAAG,MAAM,EACzB,CAAC,SAAS,MAAM,GAAG,MAAM,EACzB,CAAC,SAAS,OAAO,GAAG,CAAC,CACrB,SAAQ,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACzB,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACpB,KAAK,EAAE,CAAC,CAAA;IAER,KAAK,IAAI,QAAQ,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAA;IAChC,IAAI,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAA;IACxB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,CAAA;CAC5C"}

View File

@@ -0,0 +1,2 @@
export {};
//# sourceMappingURL=interface.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../../src/block/interface.ts"],"names":[],"mappings":""}

View File

@@ -0,0 +1,9 @@
export declare const empty: Uint8Array<ArrayBuffer>;
export declare function toHex(d: Uint8Array): string;
export declare function fromHex(hex: string): Uint8Array;
export declare function equals(aa: Uint8Array, bb: Uint8Array): boolean;
export declare function coerce(o: ArrayBufferView | ArrayBuffer | Uint8Array): Uint8Array;
export declare function isBinary(o: unknown): o is ArrayBuffer | ArrayBufferView;
export declare function fromString(str: string): Uint8Array;
export declare function toString(b: Uint8Array): string;
//# sourceMappingURL=bytes.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"bytes.d.ts","sourceRoot":"","sources":["../../src/bytes.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK,yBAAoB,CAAA;AAEtC,wBAAgB,KAAK,CAAE,CAAC,EAAE,UAAU,GAAG,MAAM,CAE5C;AAED,wBAAgB,OAAO,CAAE,GAAG,EAAE,MAAM,GAAG,UAAU,CAGhD;AAED,wBAAgB,MAAM,CAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,GAAG,OAAO,CAa/D;AAED,wBAAgB,MAAM,CAAE,CAAC,EAAE,eAAe,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,CAOjF;AAED,wBAAgB,QAAQ,CAAE,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,WAAW,GAAG,eAAe,CAExE;AAED,wBAAgB,UAAU,CAAE,GAAG,EAAE,MAAM,GAAG,UAAU,CAEnD;AAED,wBAAgB,QAAQ,CAAE,CAAC,EAAE,UAAU,GAAG,MAAM,CAE/C"}

View File

@@ -0,0 +1,44 @@
export const empty = new Uint8Array(0);
export function toHex(d) {
return d.reduce((hex, byte) => hex + byte.toString(16).padStart(2, '0'), '');
}
export function fromHex(hex) {
const hexes = hex.match(/../g);
return hexes != null ? new Uint8Array(hexes.map(b => parseInt(b, 16))) : empty;
}
export function equals(aa, bb) {
if (aa === bb) {
return true;
}
if (aa.byteLength !== bb.byteLength) {
return false;
}
for (let ii = 0; ii < aa.byteLength; ii++) {
if (aa[ii] !== bb[ii]) {
return false;
}
}
return true;
}
export function coerce(o) {
if (o instanceof Uint8Array && o.constructor.name === 'Uint8Array') {
return o;
}
if (o instanceof ArrayBuffer) {
return new Uint8Array(o);
}
if (ArrayBuffer.isView(o)) {
return new Uint8Array(o.buffer, o.byteOffset, o.byteLength);
}
throw new Error('Unknown type, must be binary type');
}
export function isBinary(o) {
return o instanceof ArrayBuffer || ArrayBuffer.isView(o);
}
export function fromString(str) {
return new TextEncoder().encode(str);
}
export function toString(b) {
return new TextDecoder().decode(b);
}
//# sourceMappingURL=bytes.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"bytes.js","sourceRoot":"","sources":["../../src/bytes.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAA;AAEtC,MAAM,UAAU,KAAK,CAAE,CAAa;IAClC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAA;AAC9E,CAAC;AAED,MAAM,UAAU,OAAO,CAAE,GAAW;IAClC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAC9B,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;AAChF,CAAC;AAED,MAAM,UAAU,MAAM,CAAE,EAAc,EAAE,EAAc;IACpD,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAAC,OAAO,IAAI,CAAA;IAAC,CAAC;IAC9B,IAAI,EAAE,CAAC,UAAU,KAAK,EAAE,CAAC,UAAU,EAAE,CAAC;QACpC,OAAO,KAAK,CAAA;IACd,CAAC;IAED,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,CAAC;QAC1C,IAAI,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACtB,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,MAAM,CAAE,CAA6C;IACnE,IAAI,CAAC,YAAY,UAAU,IAAI,CAAC,CAAC,WAAW,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAAC,OAAO,CAAC,CAAA;IAAC,CAAC;IAChF,IAAI,CAAC,YAAY,WAAW,EAAE,CAAC;QAAC,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,CAAA;IAAC,CAAC;IAC1D,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,UAAU,CAAC,CAAA;IAC7D,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;AACtD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAE,CAAU;IAClC,OAAO,CAAC,YAAY,WAAW,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;AAC1D,CAAC;AAED,MAAM,UAAU,UAAU,CAAE,GAAW;IACrC,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;AACtC,CAAC;AAED,MAAM,UAAU,QAAQ,CAAE,CAAa;IACrC,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;AACpC,CAAC"}

View File

@@ -0,0 +1,108 @@
import type * as API from './link/interface.js';
export * from './link/interface.js';
export declare function format<T extends API.Link<unknown, number, number, API.Version>, Prefix extends string>(link: T, base?: API.MultibaseEncoder<Prefix>): API.ToString<T, Prefix>;
export declare function toJSON<Link extends API.UnknownLink>(link: Link): API.LinkJSON<Link>;
export declare function fromJSON<Link extends API.UnknownLink>(json: API.LinkJSON<Link>): CID<unknown, number, number, API.Version>;
export declare class CID<Data = unknown, Format extends number = number, Alg extends number = number, Version extends API.Version = API.Version> implements API.Link<Data, Format, Alg, Version> {
readonly code: Format;
readonly version: Version;
readonly multihash: API.MultihashDigest<Alg>;
readonly bytes: Uint8Array;
readonly '/': Uint8Array;
/**
* @param version - Version of the CID
* @param code - Code of the codec content is encoded in, see https://github.com/multiformats/multicodec/blob/master/table.csv
* @param multihash - (Multi)hash of the of the content.
*/
constructor(version: Version, code: Format, multihash: API.MultihashDigest<Alg>, bytes: Uint8Array);
/**
* Signalling `cid.asCID === cid` has been replaced with `cid['/'] === cid.bytes`
* please either use `CID.asCID(cid)` or switch to new signalling mechanism
*
* @deprecated
*/
get asCID(): this;
get byteOffset(): number;
get byteLength(): number;
toV0(): CID<Data, API.DAG_PB, API.SHA_256, 0>;
toV1(): CID<Data, Format, Alg, 1>;
equals(other: unknown): other is CID<Data, Format, Alg, Version>;
static equals<Data, Format extends number, Alg extends number, Version extends API.Version>(self: API.Link<Data, Format, Alg, Version>, other: unknown): other is CID;
toString(base?: API.MultibaseEncoder<string>): string;
toJSON(): API.LinkJSON<this>;
link(): this;
readonly [Symbol.toStringTag] = "CID";
/**
* Takes any input `value` and returns a `CID` instance if it was
* a `CID` otherwise returns `null`. If `value` is instanceof `CID`
* it will return value back. If `value` is not instance of this CID
* class, but is compatible CID it will return new instance of this
* `CID` class. Otherwise returns null.
*
* This allows two different incompatible versions of CID library to
* co-exist and interop as long as binary interface is compatible.
*/
static asCID<Data, Format extends number, Alg extends number, Version extends API.Version, U>(input: API.Link<Data, Format, Alg, Version> | U): CID<Data, Format, Alg, Version> | null;
/**
* @param version - Version of the CID
* @param code - Code of the codec content is encoded in, see https://github.com/multiformats/multicodec/blob/master/table.csv
* @param digest - (Multi)hash of the of the content.
*/
static create<Data, Format extends number, Alg extends number, Version extends API.Version>(version: Version, code: Format, digest: API.MultihashDigest<Alg>): CID<Data, Format, Alg, Version>;
/**
* Simplified version of `create` for CIDv0.
*/
static createV0<T = unknown>(digest: API.MultihashDigest<typeof SHA_256_CODE>): CID<T, typeof DAG_PB_CODE, typeof SHA_256_CODE, 0>;
/**
* Simplified version of `create` for CIDv1.
*
* @param code - Content encoding format code.
* @param digest - Multihash of the content.
*/
static createV1<Data, Code extends number, Alg extends number>(code: Code, digest: API.MultihashDigest<Alg>): CID<Data, Code, Alg, 1>;
/**
* Decoded a CID from its binary representation. The byte array must contain
* only the CID with no additional bytes.
*
* An error will be thrown if the bytes provided do not contain a valid
* binary representation of a CID.
*/
static decode<Data, Code extends number, Alg extends number, Version extends API.Version>(bytes: API.ByteView<API.Link<Data, Code, Alg, Version>>): CID<Data, Code, Alg, Version>;
/**
* Decoded a CID from its binary representation at the beginning of a byte
* array.
*
* Returns an array with the first element containing the CID and the second
* element containing the remainder of the original byte array. The remainder
* will be a zero-length byte array if the provided bytes only contained a
* binary CID representation.
*/
static decodeFirst<T, C extends number, A extends number, V extends API.Version>(bytes: API.ByteView<API.Link<T, C, A, V>>): [CID<T, C, A, V>, Uint8Array];
/**
* Inspect the initial bytes of a CID to determine its properties.
*
* Involves decoding up to 4 varints. Typically this will require only 4 to 6
* bytes but for larger multicodec code values and larger multihash digest
* lengths these varints can be quite large. It is recommended that at least
* 10 bytes be made available in the `initialBytes` argument for a complete
* inspection.
*/
static inspectBytes<T, C extends number, A extends number, V extends API.Version>(initialBytes: API.ByteView<API.Link<T, C, A, V>>): {
version: V;
codec: C;
multihashCode: A;
digestSize: number;
multihashSize: number;
size: number;
};
/**
* Takes cid in a string representation and creates an instance. If `base`
* decoder is not provided will use a default from the configuration. It will
* throw an error if encoding of the CID is not compatible with supplied (or
* a default decoder).
*/
static parse<Prefix extends string, Data, Code extends number, Alg extends number, Version extends API.Version>(source: API.ToString<API.Link<Data, Code, Alg, Version>, Prefix>, base?: API.MultibaseDecoder<Prefix>): CID<Data, Code, Alg, Version>;
}
declare const DAG_PB_CODE = 112;
declare const SHA_256_CODE = 18;
//# sourceMappingURL=cid.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"cid.d.ts","sourceRoot":"","sources":["../../src/cid.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,379 @@
import { base32 } from './bases/base32.js';
import { base36 } from './bases/base36.js';
import { base58btc } from './bases/base58.js';
import { coerce } from './bytes.js';
import * as Digest from './hashes/digest.js';
import * as varint from './varint.js';
// This way TS will also expose all the types from module
export * from './link/interface.js';
export function format(link, base) {
const { bytes, version } = link;
switch (version) {
case 0:
return toStringV0(bytes, baseCache(link), base ?? base58btc.encoder);
default:
return toStringV1(bytes, baseCache(link), (base ?? base32.encoder));
}
}
export function toJSON(link) {
return {
'/': format(link)
};
}
export function fromJSON(json) {
return CID.parse(json['/']);
}
const cache = new WeakMap();
function baseCache(cid) {
const baseCache = cache.get(cid);
if (baseCache == null) {
const baseCache = new Map();
cache.set(cid, baseCache);
return baseCache;
}
return baseCache;
}
export class CID {
code;
version;
multihash;
bytes;
'/';
/**
* @param version - Version of the CID
* @param code - Code of the codec content is encoded in, see https://github.com/multiformats/multicodec/blob/master/table.csv
* @param multihash - (Multi)hash of the of the content.
*/
constructor(version, code, multihash, bytes) {
this.code = code;
this.version = version;
this.multihash = multihash;
this.bytes = bytes;
// flag to serializers that this is a CID and
// should be treated specially
this['/'] = bytes;
}
/**
* Signalling `cid.asCID === cid` has been replaced with `cid['/'] === cid.bytes`
* please either use `CID.asCID(cid)` or switch to new signalling mechanism
*
* @deprecated
*/
get asCID() {
return this;
}
// ArrayBufferView
get byteOffset() {
return this.bytes.byteOffset;
}
// ArrayBufferView
get byteLength() {
return this.bytes.byteLength;
}
toV0() {
switch (this.version) {
case 0: {
return this;
}
case 1: {
const { code, multihash } = this;
if (code !== DAG_PB_CODE) {
throw new Error('Cannot convert a non dag-pb CID to CIDv0');
}
// sha2-256
if (multihash.code !== SHA_256_CODE) {
throw new Error('Cannot convert non sha2-256 multihash CID to CIDv0');
}
return (CID.createV0(multihash));
}
default: {
throw Error(`Can not convert CID version ${this.version} to version 0. This is a bug please report`);
}
}
}
toV1() {
switch (this.version) {
case 0: {
const { code, digest } = this.multihash;
const multihash = Digest.create(code, digest);
return (CID.createV1(this.code, multihash));
}
case 1: {
return this;
}
default: {
throw Error(`Can not convert CID version ${this.version} to version 1. This is a bug please report`);
}
}
}
equals(other) {
return CID.equals(this, other);
}
static equals(self, other) {
const unknown = other;
return (unknown != null &&
self.code === unknown.code &&
self.version === unknown.version &&
Digest.equals(self.multihash, unknown.multihash));
}
toString(base) {
return format(this, base);
}
toJSON() {
return { '/': format(this) };
}
link() {
return this;
}
[Symbol.toStringTag] = 'CID';
// Legacy
[Symbol.for('nodejs.util.inspect.custom')]() {
return `CID(${this.toString()})`;
}
/**
* Takes any input `value` and returns a `CID` instance if it was
* a `CID` otherwise returns `null`. If `value` is instanceof `CID`
* it will return value back. If `value` is not instance of this CID
* class, but is compatible CID it will return new instance of this
* `CID` class. Otherwise returns null.
*
* This allows two different incompatible versions of CID library to
* co-exist and interop as long as binary interface is compatible.
*/
static asCID(input) {
if (input == null) {
return null;
}
const value = input;
if (value instanceof CID) {
// If value is instance of CID then we're all set.
return value;
}
else if ((value['/'] != null && value['/'] === value.bytes) || value.asCID === value) {
// If value isn't instance of this CID class but `this.asCID === this` or
// `value['/'] === value.bytes` is true it is CID instance coming from a
// different implementation (diff version or duplicate). In that case we
// rebase it to this `CID` implementation so caller is guaranteed to get
// instance with expected API.
const { version, code, multihash, bytes } = value;
return new CID(version, code, multihash, bytes ?? encodeCID(version, code, multihash.bytes));
}
else if (value[cidSymbol] === true) {
// If value is a CID from older implementation that used to be tagged via
// symbol we still rebase it to the this `CID` implementation by
// delegating that to a constructor.
const { version, multihash, code } = value;
const digest = Digest.decode(multihash);
return CID.create(version, code, digest);
}
else {
// Otherwise value is not a CID (or an incompatible version of it) in
// which case we return `null`.
return null;
}
}
/**
* @param version - Version of the CID
* @param code - Code of the codec content is encoded in, see https://github.com/multiformats/multicodec/blob/master/table.csv
* @param digest - (Multi)hash of the of the content.
*/
static create(version, code, digest) {
if (typeof code !== 'number') {
throw new Error('String codecs are no longer supported');
}
if (!(digest.bytes instanceof Uint8Array)) {
throw new Error('Invalid digest');
}
switch (version) {
case 0: {
if (code !== DAG_PB_CODE) {
throw new Error(`Version 0 CID must use dag-pb (code: ${DAG_PB_CODE}) block encoding`);
}
else {
return new CID(version, code, digest, digest.bytes);
}
}
case 1: {
const bytes = encodeCID(version, code, digest.bytes);
return new CID(version, code, digest, bytes);
}
default: {
throw new Error('Invalid version');
}
}
}
/**
* Simplified version of `create` for CIDv0.
*/
static createV0(digest) {
return CID.create(0, DAG_PB_CODE, digest);
}
/**
* Simplified version of `create` for CIDv1.
*
* @param code - Content encoding format code.
* @param digest - Multihash of the content.
*/
static createV1(code, digest) {
return CID.create(1, code, digest);
}
/**
* Decoded a CID from its binary representation. The byte array must contain
* only the CID with no additional bytes.
*
* An error will be thrown if the bytes provided do not contain a valid
* binary representation of a CID.
*/
static decode(bytes) {
const [cid, remainder] = CID.decodeFirst(bytes);
if (remainder.length !== 0) {
throw new Error('Incorrect length');
}
return cid;
}
/**
* Decoded a CID from its binary representation at the beginning of a byte
* array.
*
* Returns an array with the first element containing the CID and the second
* element containing the remainder of the original byte array. The remainder
* will be a zero-length byte array if the provided bytes only contained a
* binary CID representation.
*/
static decodeFirst(bytes) {
const specs = CID.inspectBytes(bytes);
const prefixSize = specs.size - specs.multihashSize;
const multihashBytes = coerce(bytes.subarray(prefixSize, prefixSize + specs.multihashSize));
if (multihashBytes.byteLength !== specs.multihashSize) {
throw new Error('Incorrect length');
}
const digestBytes = multihashBytes.subarray(specs.multihashSize - specs.digestSize);
const digest = new Digest.Digest(specs.multihashCode, specs.digestSize, digestBytes, multihashBytes);
const cid = specs.version === 0
? CID.createV0(digest)
: CID.createV1(specs.codec, digest);
return [cid, bytes.subarray(specs.size)];
}
/**
* Inspect the initial bytes of a CID to determine its properties.
*
* Involves decoding up to 4 varints. Typically this will require only 4 to 6
* bytes but for larger multicodec code values and larger multihash digest
* lengths these varints can be quite large. It is recommended that at least
* 10 bytes be made available in the `initialBytes` argument for a complete
* inspection.
*/
static inspectBytes(initialBytes) {
let offset = 0;
const next = () => {
const [i, length] = varint.decode(initialBytes.subarray(offset));
offset += length;
return i;
};
let version = next();
let codec = DAG_PB_CODE;
if (version === 18) {
// CIDv0
version = 0;
offset = 0;
}
else {
codec = next();
}
if (version !== 0 && version !== 1) {
throw new RangeError(`Invalid CID version ${version}`);
}
const prefixSize = offset;
const multihashCode = next(); // multihash code
const digestSize = next(); // multihash length
const size = offset + digestSize;
const multihashSize = size - prefixSize;
return { version, codec, multihashCode, digestSize, multihashSize, size };
}
/**
* Takes cid in a string representation and creates an instance. If `base`
* decoder is not provided will use a default from the configuration. It will
* throw an error if encoding of the CID is not compatible with supplied (or
* a default decoder).
*/
static parse(source, base) {
const [prefix, bytes] = parseCIDtoBytes(source, base);
const cid = CID.decode(bytes);
if (cid.version === 0 && source[0] !== 'Q') {
throw Error('Version 0 CID string must not include multibase prefix');
}
// Cache string representation to avoid computing it on `this.toString()`
baseCache(cid).set(prefix, source);
return cid;
}
}
function parseCIDtoBytes(source, base) {
switch (source[0]) {
// CIDv0 is parsed differently
case 'Q': {
const decoder = base ?? base58btc;
return [
base58btc.prefix,
decoder.decode(`${base58btc.prefix}${source}`)
];
}
case base58btc.prefix: {
const decoder = base ?? base58btc;
return [base58btc.prefix, decoder.decode(source)];
}
case base32.prefix: {
const decoder = base ?? base32;
return [base32.prefix, decoder.decode(source)];
}
case base36.prefix: {
const decoder = base ?? base36;
return [base36.prefix, decoder.decode(source)];
}
default: {
if (base == null) {
throw Error('To parse non base32, base36 or base58btc encoded CID multibase decoder must be provided');
}
return [source[0], base.decode(source)];
}
}
}
function toStringV0(bytes, cache, base) {
const { prefix } = base;
if (prefix !== base58btc.prefix) {
throw Error(`Cannot string encode V0 in ${base.name} encoding`);
}
const cid = cache.get(prefix);
if (cid == null) {
const cid = base.encode(bytes).slice(1);
cache.set(prefix, cid);
return cid;
}
else {
return cid;
}
}
function toStringV1(bytes, cache, base) {
const { prefix } = base;
const cid = cache.get(prefix);
if (cid == null) {
const cid = base.encode(bytes);
cache.set(prefix, cid);
return cid;
}
else {
return cid;
}
}
const DAG_PB_CODE = 0x70;
const SHA_256_CODE = 0x12;
function encodeCID(version, code, multihash) {
const codeOffset = varint.encodingLength(version);
const hashOffset = codeOffset + varint.encodingLength(code);
const bytes = new Uint8Array(hashOffset + multihash.byteLength);
varint.encodeTo(version, bytes, 0);
varint.encodeTo(code, bytes, codeOffset);
bytes.set(multihash, hashOffset);
return bytes;
}
const cidSymbol = Symbol.for('@ipld/js-cid/CID');
//# sourceMappingURL=cid.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,23 @@
import type { ArrayBufferView, ByteView } from '../block/interface.js';
/**
* IPLD encoder part of the codec.
*/
export interface BlockEncoder<Code extends number, T> {
name: string;
code: Code;
encode(data: T): ByteView<T>;
}
/**
* IPLD decoder part of the codec.
*/
export interface BlockDecoder<Code extends number, T> {
code: Code;
decode(bytes: ByteView<T> | ArrayBufferView<T>): T;
}
/**
* An IPLD codec is a combination of both encoder and decoder.
*/
export interface BlockCodec<Code extends number, T> extends BlockEncoder<Code, T>, BlockDecoder<Code, T> {
}
export type { ArrayBufferView, ByteView };
//# sourceMappingURL=interface.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../../src/codecs/interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAEtE;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,IAAI,SAAS,MAAM,EAAE,CAAC;IAClD,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,IAAI,CAAA;IACV,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,IAAI,SAAS,MAAM,EAAE,CAAC;IAClD,IAAI,EAAE,IAAI,CAAA;IACV,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;CACnD;AAED;;GAEG;AACH,MAAM,WAAW,UAAU,CAAC,IAAI,SAAS,MAAM,EAAE,CAAC,CAAE,SAAQ,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;CAAG;AAE3G,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAA"}

View File

@@ -0,0 +1,2 @@
export {};
//# sourceMappingURL=interface.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../../src/codecs/interface.ts"],"names":[],"mappings":""}

View File

@@ -0,0 +1,6 @@
import type { ArrayBufferView, ByteView } from './interface.js';
export declare const name = "json";
export declare const code = 512;
export declare function encode<T>(node: T): ByteView<T>;
export declare function decode<T>(data: ByteView<T> | ArrayBufferView<T>): T;
//# sourceMappingURL=json.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../../src/codecs/json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAK/D,eAAO,MAAM,IAAI,SAAS,CAAA;AAC1B,eAAO,MAAM,IAAI,MAAS,CAAA;AAE1B,wBAAgB,MAAM,CAAE,CAAC,EAAG,IAAI,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAEhD;AAED,wBAAgB,MAAM,CAAE,CAAC,EAAG,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAErE"}

View File

@@ -0,0 +1,11 @@
const textEncoder = new TextEncoder();
const textDecoder = new TextDecoder();
export const name = 'json';
export const code = 0x0200;
export function encode(node) {
return textEncoder.encode(JSON.stringify(node));
}
export function decode(data) {
return JSON.parse(textDecoder.decode(data));
}
//# sourceMappingURL=json.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../../src/codecs/json.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAA;AACrC,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAA;AAErC,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAA;AAC1B,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAA;AAE1B,MAAM,UAAU,MAAM,CAAM,IAAO;IACjC,OAAO,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;AACjD,CAAC;AAED,MAAM,UAAU,MAAM,CAAM,IAAsC;IAChE,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;AAC7C,CAAC"}

View File

@@ -0,0 +1,6 @@
import type { ArrayBufferView, ByteView } from './interface.js';
export declare const name = "raw";
export declare const code = 85;
export declare function encode(node: Uint8Array): ByteView<Uint8Array>;
export declare function decode(data: ByteView<Uint8Array> | ArrayBufferView<Uint8Array>): Uint8Array;
//# sourceMappingURL=raw.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"raw.d.ts","sourceRoot":"","sources":["../../../src/codecs/raw.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAE/D,eAAO,MAAM,IAAI,QAAQ,CAAA;AACzB,eAAO,MAAM,IAAI,KAAO,CAAA;AAExB,wBAAgB,MAAM,CAAE,IAAI,EAAE,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,CAE9D;AAED,wBAAgB,MAAM,CAAE,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,eAAe,CAAC,UAAU,CAAC,GAAG,UAAU,CAE5F"}

View File

@@ -0,0 +1,10 @@
import { coerce } from '../bytes.js';
export const name = 'raw';
export const code = 0x55;
export function encode(node) {
return coerce(node);
}
export function decode(data) {
return coerce(data);
}
//# sourceMappingURL=raw.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"raw.js","sourceRoot":"","sources":["../../../src/codecs/raw.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAGpC,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,CAAA;AACzB,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,CAAA;AAExB,MAAM,UAAU,MAAM,CAAE,IAAgB;IACtC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAA;AACrB,CAAC;AAED,MAAM,UAAU,MAAM,CAAE,IAAwD;IAC9E,OAAO,MAAM,CAAC,IAAI,CAAC,CAAA;AACrB,CAAC"}

View File

@@ -0,0 +1,29 @@
import type { MultihashDigest } from './interface.js';
/**
* Creates a multihash digest.
*/
export declare function create<Code extends number>(code: Code, digest: Uint8Array): Digest<Code, number>;
/**
* Turns bytes representation of multihash digest into an instance.
*/
export declare function decode(multihash: Uint8Array): MultihashDigest;
export declare function equals(a: MultihashDigest, b: unknown): b is MultihashDigest;
/**
* Represents a multihash digest which carries information about the
* hashing algorithm and an actual hash digest.
*/
export declare class Digest<Code extends number, Size extends number> implements MultihashDigest {
readonly code: Code;
readonly size: Size;
readonly digest: Uint8Array;
readonly bytes: Uint8Array;
/**
* Creates a multihash digest.
*/
constructor(code: Code, size: Size, digest: Uint8Array, bytes: Uint8Array);
}
/**
* Used to check that the passed multihash has the passed code
*/
export declare function hasCode<T extends number>(digest: MultihashDigest, code: T): digest is MultihashDigest<T>;
//# sourceMappingURL=digest.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"digest.d.ts","sourceRoot":"","sources":["../../../src/hashes/digest.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAErD;;GAEG;AACH,wBAAgB,MAAM,CAAE,IAAI,SAAS,MAAM,EAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAWlG;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAE,SAAS,EAAE,UAAU,GAAG,eAAe,CAW9D;AAED,wBAAgB,MAAM,CAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,eAAe,CAa5E;AAED;;;GAGG;AACH,qBAAa,MAAM,CAAC,IAAI,SAAS,MAAM,EAAE,IAAI,SAAS,MAAM,CAAE,YAAW,eAAe;IACtF,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;IACnB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAA;IAC3B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;IAE1B;;OAEG;gBACU,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU;CAM3E;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAE,CAAC,SAAS,MAAM,EAAG,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,GAAG,MAAM,IAAI,eAAe,CAAC,CAAC,CAAC,CAE1G"}

View File

@@ -0,0 +1,66 @@
import { coerce, equals as equalBytes } from '../bytes.js';
import * as varint from '../varint.js';
/**
* Creates a multihash digest.
*/
export function create(code, digest) {
const size = digest.byteLength;
const sizeOffset = varint.encodingLength(code);
const digestOffset = sizeOffset + varint.encodingLength(size);
const bytes = new Uint8Array(digestOffset + size);
varint.encodeTo(code, bytes, 0);
varint.encodeTo(size, bytes, sizeOffset);
bytes.set(digest, digestOffset);
return new Digest(code, size, digest, bytes);
}
/**
* Turns bytes representation of multihash digest into an instance.
*/
export function decode(multihash) {
const bytes = coerce(multihash);
const [code, sizeOffset] = varint.decode(bytes);
const [size, digestOffset] = varint.decode(bytes.subarray(sizeOffset));
const digest = bytes.subarray(sizeOffset + digestOffset);
if (digest.byteLength !== size) {
throw new Error('Incorrect length');
}
return new Digest(code, size, digest, bytes);
}
export function equals(a, b) {
if (a === b) {
return true;
}
else {
const data = b;
return (a.code === data.code &&
a.size === data.size &&
data.bytes instanceof Uint8Array &&
equalBytes(a.bytes, data.bytes));
}
}
/**
* Represents a multihash digest which carries information about the
* hashing algorithm and an actual hash digest.
*/
export class Digest {
code;
size;
digest;
bytes;
/**
* Creates a multihash digest.
*/
constructor(code, size, digest, bytes) {
this.code = code;
this.size = size;
this.digest = digest;
this.bytes = bytes;
}
}
/**
* Used to check that the passed multihash has the passed code
*/
export function hasCode(digest, code) {
return digest.code === code;
}
//# sourceMappingURL=digest.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"digest.js","sourceRoot":"","sources":["../../../src/hashes/digest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,aAAa,CAAA;AAC1D,OAAO,KAAK,MAAM,MAAM,cAAc,CAAA;AAGtC;;GAEG;AACH,MAAM,UAAU,MAAM,CAAwB,IAAU,EAAE,MAAkB;IAC1E,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAA;IAC9B,MAAM,UAAU,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;IAC9C,MAAM,YAAY,GAAG,UAAU,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;IAE7D,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC,CAAA;IACjD,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;IAC/B,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,CAAA;IACxC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IAE/B,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM,CAAE,SAAqB;IAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAA;IAC/B,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC/C,MAAM,CAAC,IAAI,EAAE,YAAY,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAA;IACtE,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,UAAU,GAAG,YAAY,CAAC,CAAA;IAExD,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;IACrC,CAAC;IAED,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;AAC9C,CAAC;AAED,MAAM,UAAU,MAAM,CAAE,CAAkB,EAAE,CAAU;IACpD,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACZ,OAAO,IAAI,CAAA;IACb,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,CAAwD,CAAA;QAErE,OAAO,CACL,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;YACpB,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;YACpB,IAAI,CAAC,KAAK,YAAY,UAAU;YAChC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAChC,CAAA;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,MAAM;IACR,IAAI,CAAM;IACV,IAAI,CAAM;IACV,MAAM,CAAY;IAClB,KAAK,CAAY;IAE1B;;OAEG;IACH,YAAa,IAAU,EAAE,IAAU,EAAE,MAAkB,EAAE,KAAiB;QACxE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAqB,MAAuB,EAAE,IAAO;IAC1E,OAAO,MAAM,CAAC,IAAI,KAAK,IAAI,CAAA;AAC7B,CAAC"}

View File

@@ -0,0 +1,48 @@
import * as Digest from './digest.js';
import type { MultihashHasher } from './interface.js';
type Await<T> = Promise<T> | T;
export interface HasherInit<Name extends string, Code extends number> {
name: Name;
code: Code;
encode(input: Uint8Array): Await<Uint8Array>;
/**
* The minimum length a hash is allowed to be truncated to in bytes
*
* @default 20
*/
minDigestLength?: number;
/**
* The maximum length a hash is allowed to be truncated to in bytes. If not
* specified it will be inferred from the length of the digest.
*/
maxDigestLength?: number;
}
export declare function from<Name extends string, Code extends number>({ name, code, encode, minDigestLength, maxDigestLength }: HasherInit<Name, Code>): Hasher<Name, Code>;
export interface DigestOptions {
/**
* Truncate the returned digest to this number of bytes.
*
* This may cause the digest method to throw/reject if the passed value is
* greater than the digest length or below a threshold under which the risk of
* hash collisions is significant.
*
* The actual value of this threshold can depend on the hashing algorithm in
* use.
*/
truncate?: number;
}
/**
* Hasher represents a hashing algorithm implementation that produces as
* `MultihashDigest`.
*/
export declare class Hasher<Name extends string, Code extends number> implements MultihashHasher<Code> {
readonly name: Name;
readonly code: Code;
readonly encode: (input: Uint8Array) => Await<Uint8Array>;
readonly minDigestLength: number;
readonly maxDigestLength?: number;
constructor(name: Name, code: Code, encode: (input: Uint8Array) => Await<Uint8Array>, minDigestLength?: number, maxDigestLength?: number);
digest(input: Uint8Array, options?: DigestOptions): Await<Digest.Digest<Code, number>>;
}
export {};
//# sourceMappingURL=hasher.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"hasher.d.ts","sourceRoot":"","sources":["../../../src/hashes/hasher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAErD,KAAK,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;AAI9B,MAAM,WAAW,UAAU,CAAE,IAAI,SAAS,MAAM,EAAE,IAAI,SAAS,MAAM;IACnE,IAAI,EAAE,IAAI,CAAA;IACV,IAAI,EAAE,IAAI,CAAA;IACV,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,CAAA;IAE5C;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IAExB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,wBAAgB,IAAI,CAAE,IAAI,SAAS,MAAM,EAAE,IAAI,SAAS,MAAM,EAAG,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,eAAe,EAAE,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAErK;AAED,MAAM,WAAW,aAAa;IAC5B;;;;;;;;;OASG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;GAGG;AACH,qBAAa,MAAM,CAAC,IAAI,SAAS,MAAM,EAAE,IAAI,SAAS,MAAM,CAAE,YAAW,eAAe,CAAC,IAAI,CAAC;IAC5F,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;IACnB,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,KAAK,CAAC,UAAU,CAAC,CAAA;IACzD,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;IAChC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;gBAEpB,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,KAAK,CAAC,UAAU,CAAC,EAAE,eAAe,CAAC,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM;IAQzI,MAAM,CAAE,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;CAwBxF"}

View File

@@ -0,0 +1,58 @@
import * as Digest from './digest.js';
const DEFAULT_MIN_DIGEST_LENGTH = 20;
export function from({ name, code, encode, minDigestLength, maxDigestLength }) {
return new Hasher(name, code, encode, minDigestLength, maxDigestLength);
}
/**
* Hasher represents a hashing algorithm implementation that produces as
* `MultihashDigest`.
*/
export class Hasher {
name;
code;
encode;
minDigestLength;
maxDigestLength;
constructor(name, code, encode, minDigestLength, maxDigestLength) {
this.name = name;
this.code = code;
this.encode = encode;
this.minDigestLength = minDigestLength ?? DEFAULT_MIN_DIGEST_LENGTH;
this.maxDigestLength = maxDigestLength;
}
digest(input, options) {
if (options?.truncate != null) {
if (options.truncate < this.minDigestLength) {
throw new Error(`Invalid truncate option, must be greater than or equal to ${this.minDigestLength}`);
}
if (this.maxDigestLength != null && options.truncate > this.maxDigestLength) {
throw new Error(`Invalid truncate option, must be less than or equal to ${this.maxDigestLength}`);
}
}
if (input instanceof Uint8Array) {
const result = this.encode(input);
if (result instanceof Uint8Array) {
return createDigest(result, this.code, options?.truncate);
}
return result.then(digest => createDigest(digest, this.code, options?.truncate));
}
else {
throw Error('Unknown type, must be binary type');
/* c8 ignore next 1 */
}
}
}
/**
* Create a Digest from the passed uint8array and code, optionally truncating it
* first.
*/
function createDigest(digest, code, truncate) {
if (truncate != null && truncate !== digest.byteLength) {
if (truncate > digest.byteLength) {
throw new Error(`Invalid truncate option, must be less than or equal to ${digest.byteLength}`);
}
digest = digest.subarray(0, truncate);
}
return Digest.create(code, digest);
}
//# sourceMappingURL=hasher.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"hasher.js","sourceRoot":"","sources":["../../../src/hashes/hasher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AAKrC,MAAM,yBAAyB,GAAG,EAAE,CAAA;AAqBpC,MAAM,UAAU,IAAI,CAA6C,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,eAAe,EAA0B;IAC/I,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,eAAe,CAAC,CAAA;AACzE,CAAC;AAgBD;;;GAGG;AACH,MAAM,OAAO,MAAM;IACR,IAAI,CAAM;IACV,IAAI,CAAM;IACV,MAAM,CAA0C;IAChD,eAAe,CAAQ;IACvB,eAAe,CAAS;IAEjC,YAAa,IAAU,EAAE,IAAU,EAAE,MAAgD,EAAE,eAAwB,EAAE,eAAwB;QACvI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,eAAe,GAAG,eAAe,IAAI,yBAAyB,CAAA;QACnE,IAAI,CAAC,eAAe,GAAG,eAAe,CAAA;IACxC,CAAC;IAED,MAAM,CAAE,KAAiB,EAAE,OAAuB;QAChD,IAAI,OAAO,EAAE,QAAQ,IAAI,IAAI,EAAE,CAAC;YAC9B,IAAI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC5C,MAAM,IAAI,KAAK,CAAC,6DAA6D,IAAI,CAAC,eAAe,EAAE,CAAC,CAAA;YACtG,CAAC;YAED,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,IAAI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC5E,MAAM,IAAI,KAAK,CAAC,0DAA0D,IAAI,CAAC,eAAe,EAAE,CAAC,CAAA;YACnG,CAAC;QACH,CAAC;QAED,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YAEjC,IAAI,MAAM,YAAY,UAAU,EAAE,CAAC;gBACjC,OAAO,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;YAC3D,CAAC;YAED,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAA;QAClF,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,CAAC,mCAAmC,CAAC,CAAA;YAChD,sBAAsB;QACxB,CAAC;IACH,CAAC;CACF;AAED;;;GAGG;AACH,SAAS,YAAY,CAAwB,MAAkB,EAAE,IAAU,EAAE,QAAiB;IAC5F,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ,KAAK,MAAM,CAAC,UAAU,EAAE,CAAC;QACvD,IAAI,QAAQ,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,0DAA0D,MAAM,CAAC,UAAU,EAAE,CAAC,CAAA;QAChG,CAAC;QAED,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;IACvC,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;AACpC,CAAC"}

Some files were not shown because too many files have changed in this diff Show More